自己写个了个小东西,Linux下C语言,数据库使用的mysql,用valgrind调试的时候一直提示内存泄露,问题都没找到,后来搜索了一下,最后发现是mysql_real_connect惹的祸。
提示的错误:
==11867== 24,528 bytes in 6 blocks are possibly lost in loss record 4 of 5
==11867== at 0x4025BD3: malloc (vg_replace_malloc.c:236)
==11867== by 0x408F53D: my_once_alloc (in /usr/lib/libmysqlclient.so.16.0.0)
==11867== by 0x408FDB8: ??? (in /usr/lib/libmysqlclient.so.16.0.0)
==11867== by 0x4090889: ??? (in /usr/lib/libmysqlclient.so.16.0.0)
==11867== by 0x4090ADB: get_charset_by_csname (in /usr/lib/libmysqlclient.so.16.0.0)
==11867== by 0x40B3211: mysql_init_character_set (in /usr/lib/libmysqlclient.so.16.0.0)
==11867== by 0x40B52DB: mysql_real_connect (in /usr/lib/libmysqlclient.so.16.0.0)
==11867== by 0x804DCBE: testDbState (database.c:19)
==11867== by 0x8049811: main (main.c:5)
==11867==
==11867== 28,616 bytes in 7 blocks are possibly lost in loss record 5 of 5
==11867== at 0x4025BD3: malloc (vg_replace_malloc.c:236)
==11867== by 0x408F53D: my_once_alloc (in /usr/lib/libmysqlclient.so.16.0.0)
==11867== by 0x408FD99: ??? (in /usr/lib/libmysqlclient.so.16.0.0)
==11867== by 0x4090889: ??? (in /usr/lib/libmysqlclient.so.16.0.0)
==11867== by 0x4090ADB: get_charset_by_csname (in /usr/lib/libmysqlclient.so.16.0.0)
==11867== by 0x40B3211: mysql_init_character_set (in /usr/lib/libmysqlclient.so.16.0.0)
==11867== by 0x40B52DB: mysql_real_connect (in /usr/lib/libmysqlclient.so.16.0.0)
==11867== by 0x804DCBE: testDbState (database.c:19)
==11867== by 0x8049811: main (main.c:5)
==11867==
==11867== LEAK SUMMARY:
==11867== definitely lost: 0 bytes in 0 blocks
==11867== indirectly lost: 0 bytes in 0 blocks
==11867== possibly lost: 53,144 bytes in 13 blocks
==11867== still reachable: 8,192 bytes in 3 blocks
==11867== suppressed: 0 bytes in 0 blocks
==11867==
==11867== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 37 from 12)
--11867--
--11867-- used_suppression: 37 dl-hack3-cond-1
==11867==
==11867== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 37 from 12)
原来使用mysql_real_connect之后,断开连接后必须得mysql_library_end();
mysql_close(conn);
conn=NULL;
mysql_library_end();
这样再次调试就不出错了,看到这句话
ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 37 from 12)
我激动啊。
valgrind --db-attach=yes --leak-check=full --show-reachable=yes --tool=memcheck -v ./main
--10599-- REDIR: 0x42ac880 (strnlen) redirected to 0x4026c50 (strnlen)
--10599-- Discarding syms at 0x4836a20-0x483de08 in /lib/libnss_files-2.12.1.so due to munmap()
--10599-- Discarding syms at 0x402c8b0-0x402d6c8 in /lib/libnss_mdns4_minimal.so.2 due to munmap()
--10599-- Discarding syms at 0x4030bb0-0x4033bd8 in /lib/libnss_dns-2.12.1.so due to munmap()
--10599-- Discarding syms at 0x5458630-0x54646d8 in /lib/libresolv-2.12.1.so due to munmap()
==10599==
==10599== HEAP SUMMARY:
==10599== in use at exit: 0 bytes in 0 blocks
==10599== total heap usage: 3,255 allocs, 3,255 frees, 82,930,848 bytes allocated
==10599==
==10599== All heap blocks were freed -- no leaks are possible
==10599==
==10599== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 37 from 12)
--10599--
--10599-- used_suppression: 37 dl-hack3-cond-1
==10599==
==10599== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 37 from 12)