MySQL C API内存泄漏?

Phi*_*lip 3 c mysql api valgrind memory-leaks

最近,我开始研究一个使用它的C程序libmysqlclient.在检查我的代码时valgrind,它报告了内存泄漏.以下最小代码段重现了该行为:

#include <mysql.h>

int main(void)
{
    MYSQL* mysql = mysql_init(0);

    mysql_close(mysql);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

检查生成的程序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
Run Code Online (Sandbox Code Playgroud)

根据MySQL API参考,mysql_close()...

关闭先前打开的连接.如果句柄是由mysql_init()或mysql_connect()自动分配的,mysql_close()还会释放mysql指向的连接句柄.

但是,valgrind报告没有释放内存.这有什么不对?

Phi*_*lip 6

通过文档挖掘,我发现了mysql_library_end()解决问题的功能.

引用MySQL API参考:

该函数最终确定了MySQL库.完成使用库后应该调用它(例如,在断开与服务器的连接后).

在个人方面,我发现它很烦人,libmysqlclient迫使其用户调用自己的清理功能.IMO,一个更好的解决方案是mysql_library_end()在连接数降至零时自动调用.

  • 6分钟可以有所作为 (4认同)