MySQL-"Datenreihe" freigeben
-
Darf man den Speicher einer "abgeholten Datenreihe" von MySQL per free(); freigeben bzw. wird dieser durch Verlassen der Funktion automatisch freigegeben?
Also z.B.:MYSQL_RES* res = mysql_query("SELECT * FROM ..."); MYSQL_ROW row = mysql_fetch(res); mysql_free_result(res); if(row == NULL) { ... return true; } free(row); return true;
Bei mir funktioniert das einwandfrei, nur frag ich mich ob das nötig ist oder ob das nur Glück ist, dass es funktioniert.
-
Dr. C++ schrieb:
free(row);
Das brauchst Du nicht. Ich würde das auch nicht machen.
-
Dann würde der Speicher, der für die Zeile reserviert würde doch theoretisch im Arbeitsspeicher liegen bleiben. Das macht sich bei nem Server, der später ne enorme Anzahl an Verbindungen verkraften soll, nicht sonderlich gut, da er ja immer mehr Speicher belegen würde, der nicht mehr freiegeben wird.
-
Du gibst die Daten mit mysql_free_result(res) wieder frei.
Siehe auch MySQL C-API :
[...]
In beiden Fällen greifen Sie mit mysql_fetch_row() auf die Zeilen zu. Mit mysql_store_result() greift sich mysql_fetch_row() Zeilen, die vom Server bereits abgeholt worden sind. Mit mysql_use_result() ruft mysql_fetch_row() die jeweilige Zeile selbst vom Server. Informationen über den Umfang der Daten in den Zeilen liefert Ihnen mysql_fetch_lengths().
**
Wenn Sie mit einer Ergebnismenge fertig sind, geben Sie mit mysql_free_result() ihren Arbeitsspeicher wieder frei.
**
[...]
*
http://dev.mysql.com/doc/refman/5.1/de/c-api-function-overview.html
-
D.h. wenn ich mysql_free_result(res); Aufrufe wird der Speicher von der abgeholten Reihe auch freigegeben? Dann frag ich mich aber, warum mein geposteter Code trotzdem funktioniert...
-
Ob und wie free() eine Fehlermeldung erzeugt kann ich Dir nicht sagen.
-
Meine letzte Frage hatte jetzt so ziemlich gar nichts mit free() zu tun, sondern ob die Datenreihen über mysql_free_result() auch freigegeben werden...
-
Meine Antwort bezog sich auf Deine Frage, warum Dein Code trotzdem funktioniert. Ich habe Dir geantwortet, dass Du Deine Daten mit mysql_free_result() wieder freigibst und Du MYSQL_ROW nicht mit free bearbeiten sollst. Weiterhin habe ich Dir einen Link zu der Dokumentation der C API von MySQL gepostet. Welcher Deiner Fragen ist denn jetzt noch unbeantwortet ?
-
SciFi schrieb:
Meine Antwort bezog sich auf Deine Frage, warum Dein Code trotzdem funktioniert. Ich habe Dir geantwortet, dass Du Deine Daten mit mysql_free_result() wieder freigibst und Du MYSQL_ROW nicht mit free bearbeiten sollst. Weiterhin habe ich Dir einen Link zu der Dokumentation der C API von MySQL gepostet. Welcher Deiner Fragen ist denn jetzt noch unbeantwortet ?
Jetzt schon zum 3. mal: deiner Aussage zu Folge gibt mysql_free_result() den Speicher für das Result frei. Ich will jetzt aber wissen, ob damit auch der Speicher für die zuletzt abgeholte Datenreihe freigegeben wird. In der Doku steht auch nur das mit dem Result.
-
Ok, Sorry. Ich bin wohl davon ausgegangen, dass es klar ist. Ja, es wird mit freigegeben. Du musst selber nur dann Daten freigeben, wenn Du sie mit new oder (malloc bei c ?) angefragt hast. Eine Row ist nicht weiter als ein Zeiger auf ein Char Array :
typedef char **MYSQL_ROW;
Du erhälst einen Zeiger auf die Daten. Wenn Du jetzt Die Daten mit mysql_free_result freigibst, dann ist der Zeiger ungültig.
-
Dann frag ich mich aber, warum folgender Code funzt:
// check it sprintf(queryBuffer, "SELECT `account_id` FROM loginsrv_accounts WHERE account_username = '%s' AND account_password = MD5('%s')", usernameBuf, passwordBuf); resBuf = mysql.query(queryBuffer); rowBuf = mysql.fetch(resBuf); mysql.free(resBuf); if(rowBuf == NULL) { if(failedCount == (failedMax - 1)) { // add the IP to the block list connection->send("# Maximum number of failed login tries reached\n\r"); return true; } connection->send("# Wrong data, please try again\n\r"); failedCount++; continue; } free(rowBuf); connection->send("# Login correct\n\r"); break;
Wenn die richtigen Daten eingegeben werden, kommt auch "# Login correct". Das dürfte deiner Meinung nach aber gar nicht funktionieren, denn wenn bei mysql_free_result() der Zeiger der letzten Reihe auf NULL gesetzt wird, würde if(rowBuf == NULL) ja immer true ergeben und es würde "# Wrong data, please try again" kommen.
-
Ich habe nicht behauptet, dass der Zeiger NULL ist Den Gedankenfehler hatte ich auch mal, musste mich aber eines besseren belehren lassen.
Versuche doch mal die Row anzusprechen. Das dürfte nicht gehen.
Das mit den Zeiger und NULL kannst Du hier nochmal nachlesen : http://www.c-plusplus.net/forum/viewtopic-var-t-is-164816-and-highlight-is-%2Asafedelete%2A.html