2010-08-29 85 views
8

我最近一直在通過Valgrind運行我的一個應用程序,但有幾個MYSQL相關的泄漏我無法修復。我把這些有問題的代碼放在最基本的形式中,並對其進行測試;我得到了同樣的泄漏。我應該忽略它們還是我做錯了什麼?Valgrind可能丟失 - MYSQL

代碼:

#include <stdio.h> 
#include <stdlib.h> 

#include <mysql/mysql.h> 

int main() 
{ 
    MYSQL *MYSQLIns; 

    MYSQLIns = mysql_init(NULL); 

    mysql_real_connect(MYSQLIns, "localhost", "username", "password", "database", 0, NULL, 0); 

    mysql_close(MYSQLIns); 

    return EXIT_SUCCESS; 
} 

編譯:

gcc -g -lmysqlclient mysql_mem_test.c -o mysql_mem_test 

Valgrind的輸出:

valgrind --leak-check=full ./mysql_mem_test 
==4601== Memcheck, a memory error detector 
==4601== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al. 
==4601== Using Valgrind-3.5.0-Debian and LibVEX; rerun with -h for copyright info 
==4601== Command: ./mysql_mem_test 
==4601== 
==4601== 
==4601== HEAP SUMMARY: 
==4601==  in use at exit: 61,336 bytes in 16 blocks 
==4601== total heap usage: 70 allocs, 54 frees, 109,218 bytes allocated 
==4601== 
==4601== 24,528 bytes in 6 blocks are possibly lost in loss record 4 of 5 
==4601== at 0x4024C1C: malloc (vg_replace_malloc.c:195) 
==4601== by 0x4079BB2: my_once_alloc (in /usr/lib/libmysqlclient.so.16.0.0) 
==4601== by 0x407A408: ??? (in /usr/lib/libmysqlclient.so.16.0.0) 
==4601== by 0x407AED1: ??? (in /usr/lib/libmysqlclient.so.16.0.0) 
==4601== by 0x407B112: get_charset_by_csname (in /usr/lib/libmysqlclient.so.16.0.0) 
==4601== by 0x409D55B: mysql_init_character_set (in /usr/lib/libmysqlclient.so.16.0.0) 
==4601== by 0x409F5A1: mysql_real_connect (in /usr/lib/libmysqlclient.so.16.0.0) 
==4601== by 0x80485E0: main (mysql_mem_test.c:12) 
==4601== 
==4601== 28,616 bytes in 7 blocks are possibly lost in loss record 5 of 5 
==4601== at 0x4024C1C: malloc (vg_replace_malloc.c:195) 
==4601== by 0x4079BB2: my_once_alloc (in /usr/lib/libmysqlclient.so.16.0.0) 
==4601== by 0x407A3E9: ??? (in /usr/lib/libmysqlclient.so.16.0.0) 
==4601== by 0x407AED1: ??? (in /usr/lib/libmysqlclient.so.16.0.0) 
==4601== by 0x407B112: get_charset_by_csname (in /usr/lib/libmysqlclient.so.16.0.0) 
==4601== by 0x409D55B: mysql_init_character_set (in /usr/lib/libmysqlclient.so.16.0.0) 
==4601== by 0x409F5A1: mysql_real_connect (in /usr/lib/libmysqlclient.so.16.0.0) 
==4601== by 0x80485E0: main (mysql_mem_test.c:12) 
==4601== 
==4601== LEAK SUMMARY: 
==4601== definitely lost: 0 bytes in 0 blocks 
==4601== indirectly lost: 0 bytes in 0 blocks 
==4601==  possibly lost: 53,144 bytes in 13 blocks 
==4601== still reachable: 8,192 bytes in 3 blocks 
==4601==   suppressed: 0 bytes in 0 blocks 
==4601== Reachable blocks (those to which a pointer was found) are not shown. 
==4601== To see them, rerun with: --leak-check=full --show-reachable=yes 
==4601== 
==4601== For counts of detected and suppressed errors, rerun with: -v 
==4601== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 55 from 38) 

回答

16

是否mysql_close幫助後加入mysql_library_end();

更新:安裝valgrind並嘗試它,並且確實如此。 mysql_init()隱式地執行mysql_library_init(),但是mysql_close()不會類似地執行mysql_library_end(),文檔暗示但不直接說出來。

+0

非常感謝,從來沒有聽說過這個功能。再次感謝! – Kewley 2010-08-30 00:10:25