2013-02-21 25 views
3

我寫一個簡單的C程序從一個MySQL要求的一些數據DB在單線程應用程序中使用時,該功能不報告內存泄漏,但在同時,一個線程它。Memoryleak在MySQL中使用不同的線程

功能是這個我每次剝離的功能,所以它必須是一個錯誤

什麼我做錯了執行泄漏時間增加的unnecesary碼

BOOL getip(char * ip,int * port,BOOL serie) 
{ 
    MYSQL * conn,mysql; 
    MYSQL_RES * res; 
    MYSQL_ROW row; 



    char * server = "someip"; 
    char * user = "root"; 
    char * pass = "root"; 
    char * db = "testdb"; 
    char * query = NULL; 

mysql_init(&mysql); 

mysql_close(&mysql); 

} 

> ==30295== HEAP SUMMARY: 
> ==30295==  in use at exit: 73,872 bytes in 21 blocks 
> ==30295== total heap usage: 85 allocs, 64 frees, 119,908 bytes allocated 
> ==30295== 
> ==30295== 128 bytes in 1 blocks are definitely lost in loss record 2 of 5 
> ==30295== at 0x402A629: calloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 
> ==30295== by 0x408FB63: my_thread_init (in /usr/lib/i386-linux-gnu/libmysqlclient.so.18.0.0) 
> ==30295== by 0x408FE43: my_thread_global_init (in /usr/lib/i386-linux-gnu/libmysqlclient.so.18.0.0) 
> ==30295== by 0x408E2D7: my_init (in /usr/lib/i386-linux-gnu/libmysqlclient.so.18.0.0) 
> ==30295== by 0x406B3FA: mysql_server_init (in /usr/lib/i386-linux-gnu/libmysqlclient.so.18.0.0) 
> ==30295== by 0x406CB28: mysql_init (in /usr/lib/i386-linux-gnu/libmysqlclient.so.18.0.0) 
> ==30295== by 0x8048DD1: getip (database.c:22) 
> ==30295== by 0x80492DD: sockit (listener.c:50) 
> ==30295== by 0x4378D4B: start_thread (pthread_create.c:308) 
> ==30295== by 0x447BD3D: clone (clone.S:130) 
> ==30295== 
> ==30295== LEAK SUMMARY: 
> ==30295== definitely lost: 128 bytes in 1 blocks 
> ==30295== indirectly lost: 0 bytes in 0 blocks 
> ==30295==  possibly lost: 0 bytes in 0 blocks 
> ==30295== still reachable: 73,744 bytes in 20 blocks 
> ==30295==   suppressed: 0 bytes in 0 blocks 
> ==30295== Reachable blocks (those to which a pointer was found) are not shown. 
> ==30295== To see them, rerun with: --leak-check=full --show-reachable=yes 

+0

有人建議使用mysql_library_end的();你猜怎麼着 ?有用。我不知道他爲什麼刪除了他的答案! – opc0de 2013-02-21 11:13:16

+0

對不起,我按錯按鈕 – 2013-02-21 11:21:15

回答

3

在最後幫助是否mysql_library_end();

測試此:

int main(void) 
{ 
    MYSQL *mysql; 

    mysql_init(mysql); 
    mysql_close(mysql); 
    mysql_library_end(); 

    return 0; 
} 
+2

謝謝!它的工作原理,在我瀏覽互聯網的所有例子中,沒有一個引用這個函數。 – opc0de 2013-02-21 11:29:42

+0

是的,這是一個有點隱蔽:( – 2013-02-21 12:06:40

2

嘗試的mysql_thread_end()代替mysql_library_end()

+0

工作對我來說,在我的線程中調用這個之後就再也沒有內存泄漏。 – razzak 2016-01-19 17:42:21

相關問題