I 2 Codes (Programme)wenn mysql_free_result (Resuing mysql_store_result, MYSQL_RES) zu nennen
Programm 1:
//global variables
MYSQL_RES *res_set;
MYSQL_ROW row;
MYSQL *connect;
int main()
{
connect=mysql_init(NULL);
mysql_real_connect(connect, NULL, "root", "suvp" ,"Employees" ,0,NULL,0);
/*Other Code*/
mysql_free_result(res_set);
mysql_close(connect);
}
"anderen Code" beinhaltet eine for-Schleife, die Funktionen aufruft, die Verwenden Sie das gleiche res_set
zum Speichern der Ergebnisse von mysql_store_result
. Wie ich sehe, rufe ich mysql_free_result(res_set);
nur einmal am Ende des Main.
valgrind
zeigt still reachable
Speicherprobleme im obigen Fall (die ich ignoriert habe). Keine anderen Lecks sind vorhanden.
Programm 2:
Klasse mysqlClientClass folgende private Variablen hat,
MYSQL *connect;
MYSQL_RES *res_set;
MYSQL_ROW row;
Einige der Methoden sind (relevant für meine Ausgabe),
mysqlClientClass::~mysqlClientClass()
{
if(connect!=NULL)
{
mysql_free_result(res_set);
mysql_close(connect);
}
}
Wenn der Benutzer nicht Rufen Sie closeConnection
auf, der Destruktor wird es schließen (indem Sie überprüfen, ob connect
auf NULL oder nicht festgelegt ist)
void mysqlClientClass::closeConnection()
{
mysql_free_result(res_set);
mysql_close(connect);
connect = NULL;
}
getResults
ist die einzige Methode in dem gesamten Code, die mysql_store_result
void mysqlClientClass::getResults(string iQuery)
{
/* form query
execute Query */
res_set = mysql_store_result(connect);
/* Do other things */
mysql_free_result(res_set); // ------------------------>
res_set = NULL;
}
}
Wenn ich die res_set
am Ende der Funktion frei nicht verwendet (und kostenlos in den destructor/close Connection
nur) und ich mache mehrere Anrufe an diese Funktion valgrind Berichte,
=10162== LEAK SUMMARY:
==10162== definitely lost: 312 bytes in 3 blocks
==10162== indirectly lost: 49,152 bytes in 9 blocks
==10162== possibly lost: 0 bytes in 0 blocks
==10162== still reachable: 73,872 bytes in 21 blocks
==10162== suppressed: 0 bytes in 0 blocks
==10162== Reachable blocks (those to which a pointer was found) are not shown.
==10162== To see them, rerun with: --leak-check=full --show-reachable=yes
==10162==
==10162== For counts of detected and suppressed errors, rerun with: -v
==10162== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)
und es kommt alles auf mysql_store_result
==10162== by 0x406C3CA: mysql_store_result (in /usr/lib/i386-linux-gnu/libmysqlclient.so.18.0.0)
==10162== by 0x8048E03: mysqlClientClass::getResults(std::string) (mysqlClientClass.cpp:103)
Gemäß der manual Seite von mysql_store_result
mysql_store_result(), um das gesamte Ergebnis einer Anfrage an den Client liest, ordnet eine MYSQL_RES Struktur, und das Ergebnis in diesem Struktur.
und es schlägt auch vor, dass ich nach Gebrauch free_result
anrufen sollte.
Dies scheint zu funktionieren, wie in Programm 2 dokumentiert (Speicherlecks, wenn ich nicht mysql_free_result
aufrufen), aber warum zeigt dann Programm 1 keine Lecks? Auch in Programm 1 mache ich mehrere Anrufe zwischen verschiedenen Funktionen an mysql_store_result
, ohne jedes Mal freizugeben.