最近,我开始开发一个利用libmysqlclient
的c程序。当用valgrind
检查我的代码时,它报告内存泄漏。下面的最小代码片段再现了该行为:
#include <mysql.h>
int main(void)
{
MYSQL* mysql = mysql_init(0);
mysql_close(mysql);
return 0;
}
用
valgrind
检查生成的程序会告诉我:==25614== LEAK SUMMARY:
==25614== definitely lost: 0 bytes in 0 blocks
==25614== indirectly lost: 0 bytes in 0 blocks
==25614== possibly lost: 0 bytes in 0 blocks
==25614== still reachable: 288 bytes in 3 blocks
==25614== suppressed: 0 bytes in 0 blocks
根据mysql api参考,
mysql_close()
。关闭以前打开的连接。如果连接句柄是由mysql_init()或mysql_connect()自动分配的,mysql_close()还会释放mysql指向的连接句柄。
但是,
valgrind
报告未释放的内存。这里怎么了? 最佳答案
在查阅文档时,我找到了解决问题的函数mysql_library_end()
。
引用mysql api参考:
此函数完成mysql库。使用完库后(例如,断开与服务器的连接后),应该调用它。
我个人认为,libmysqlclient
强迫用户调用自己的清理函数是相当烦人的。imo,一个更好的解决方案是每当连接计数降至零时自动调用mysql_library_end()
。