最近,我开始开发一个利用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()

10-01 00:31