2013-05-29 8 views
8

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.

Antwort

-3

Sie nicht mysql_store_result benötigen, um Daten aus der Abfrage zu erhalten - verwenden Rückrufe mit sqlite3_exec

int ListDataCallback(void *pArg, int argc, char **argv, char **columnNames){ 
    //cast pArg to your user data pointer 
    //argc - count of columns in the result 
    //argv - a result field as string 

    return 0; 
} 

void get_data() 
{ 
    char *selectErrMsgP = NULL; 
    int err = sqlite3_exec(database, selectQ, ListDataCallback, (void*)myUserData, &selectErrMsgP); 
    if(err) { 
     //handle error 
    } 
} 

hatte nie irgendwelche Löcher mit diesem Ansatz

Verwandte Themen