【问题标题】:Memoryleak in mysql using different threadmysql中的内存泄漏使用不同的线程
【发布时间】:2013-02-21 10:16:48
【问题描述】:

我正在编写一个简单的 C 程序来从 mysql 数据库请求一些数据,该函数在单线程应用程序中使用时不会报告内存泄漏,但在线程中会报告。

函数就是这个我去掉了不必要的代码

BOOL getip(char * ip,int * port,BOOL serie)
{
    MYSQL * conn,mysql;
    MYSQL_RES * res;
    MYSQL_ROW row;



   char * server = "someip";
    char * user = "root";
    char * pass = "root";
    char * db = "testdb";
    char * query = NULL;

mysql_init(&mysql);

mysql_close(&mysql);

}

> ==30295== HEAP SUMMARY:
> ==30295==     in use at exit: 73,872 bytes in 21 blocks
> ==30295==   total heap usage: 85 allocs, 64 frees, 119,908 bytes allocated
> ==30295== 
> ==30295== 128 bytes in 1 blocks are definitely lost in loss record 2 of 5
> ==30295==    at 0x402A629: calloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
> ==30295==    by 0x408FB63: my_thread_init (in /usr/lib/i386-linux-gnu/libmysqlclient.so.18.0.0)
> ==30295==    by 0x408FE43: my_thread_global_init (in /usr/lib/i386-linux-gnu/libmysqlclient.so.18.0.0)
> ==30295==    by 0x408E2D7: my_init (in /usr/lib/i386-linux-gnu/libmysqlclient.so.18.0.0)
> ==30295==    by 0x406B3FA: mysql_server_init (in /usr/lib/i386-linux-gnu/libmysqlclient.so.18.0.0)
> ==30295==    by 0x406CB28: mysql_init (in /usr/lib/i386-linux-gnu/libmysqlclient.so.18.0.0)
> ==30295==    by 0x8048DD1: getip (database.c:22)
> ==30295==    by 0x80492DD: sockit (listener.c:50)
> ==30295==    by 0x4378D4B: start_thread (pthread_create.c:308)
> ==30295==    by 0x447BD3D: clone (clone.S:130)
> ==30295== 
> ==30295== LEAK SUMMARY:
> ==30295==    definitely lost: 128 bytes in 1 blocks
> ==30295==    indirectly lost: 0 bytes in 0 blocks
> ==30295==      possibly lost: 0 bytes in 0 blocks
> ==30295==    still reachable: 73,744 bytes in 20 blocks
> ==30295==         suppressed: 0 bytes in 0 blocks
> ==30295== Reachable blocks (those to which a pointer was found) are not shown.
> ==30295== To see them, rerun with: --leak-check=full --show-reachable=yes

每次函数执行时泄漏都会增加,所以它一定是一个错误

我做错了什么?

【问题讨论】:

  • 有人建议使用mysql_library_end();你猜怎么着 ?有用。我不知道他为什么删除了他的答案!
  • 对不起,我按错了按钮

标签: mysql c gcc memory-leaks


【解决方案1】:

mysql_library_end();最后有帮助吗?

测试一下:

int main(void)
{
    MYSQL *mysql;

    mysql_init(mysql);
    mysql_close(mysql);
    mysql_library_end();

    return 0;
}

【讨论】:

  • 谢谢!它有效,在我浏览互联网的所有示例中,没有一个引用此函数。
  • 是的,有点隐蔽:(
【解决方案2】:

尝试mysql_thread_end() 而不是mysql_library_end()

【讨论】:

  • 为我工作,在我的线程中调用它后不再有内存泄漏。
猜你喜欢
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 2014-10-29
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 2017-02-04
  • 2016-12-09
相关资源
最近更新 更多