`
pipal
  • 浏览: 163677 次
  • 性别: Icon_minigender_1
  • 来自: 南宁
社区版块
存档分类
最新评论

linux mysql mysql_real_connect函数导致内存泄露

阅读更多

自己写个了个小东西,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)

  

 

 

 参考资料:http://dev.mysql.com/doc/refman/5.0/en/mysql-library-end.html

                http://blog.csdn.net/weihua1984/archive/2010/08/24/5835731.aspx

 

1
0
分享到:
评论
2 楼 pipal 2013-02-18  
烟雨遥_sun 写道
很强大,正好遇到这个问题,感谢楼主分享!

1 楼 烟雨遥_sun 2013-01-30  
很强大,正好遇到这个问题,感谢楼主分享!

相关推荐

    Linux下实现C++操作Mysql数据库

    想用C++写项目,数据库是必须的,所以这两天学了一下C++操作MySQL数据库的方法。也没有什么教程,就是在网上搜的知识,下面汇总一下。...MYSQL *mysql_real_connect (MYSQL *mysql, const char *host,

    MySQL中文参考手册

    * 1 MySQL的一般的信息 o 1.1 什么是MySQL? o 1.2 关于本手册 + 1.2.1 本手册中使用的约定 o 1.3 MySQL的历史 o 1.4 MySQL的主要特征 o 1.5 MySQL稳定性? o 1.6 顺应2000年 o 1.7 SQL一般信息和教程 o ...

    MySQL中文参考手册.chm

    MySQL中文参考手册.chm 449kb <br/>0 译者序 1 MySQL的一般的信息 1.1 什么是MySQL? 1.2 关于本手册 1.2.1 本手册中使用的约定 1.3 MySQL的历史 1.4 MySQL的主要特征 1.5...

    Mysql的接口函数

    使用mysql_real_connect()代替。  mysql_change_user() 改变在一个打开的连接上的用户和数据库。  mysql_create_db() 创建一个数据库。该函数不推荐;而使用SQL命令CREATE DATABASE。  mysql_data_seek() 在一...

    MYSQL

    Apache一起使用 MySQL 18 问题和常见的错误 18.1 如果 MySQL总是崩溃怎么办 18.2 使用 MySQL 时一些常见错误 18.2.1 MySQL server has gone away错误 18.2.2 Can't connect to [local] MySQL ...

    PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): …

    背景:把mysql换成mysqli时出现,连接数过多,其实际上并不是,原因是我挪动了一下php的sock文件位置导致,因这几个socket修改没有修改完全,于是出现了too many connections ,从mysql里show processlist并没有发现...

    PHP的mysqli_ssl_set()函数讲解

    PHP mysqli_ssl_set() 函数 实例 创建 SSL 连接: <?...$con=mysqli_init();...mysqli_real_connect($con,localhost,my_user,my_password,my_db)) { die(Connect Error: . mysqli_connect_error());

    MySQL的C语言API接口

    MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long clientflag); 第一个...

    解决mysql 1040错误Too many connections的方法

    从官方文档知道linux上面编译安装的mysql默认的连接为100个,这样对于网站的需求来说是远远不够的。 mysql官方告诉我们需要修改max_connections的值,那么我们怎么去修改呢?有两种方法 1、修改配置文件文件 修改/etc...

    Mysql错误:Too many connections的解决方法

    MySQL数据库 Too many ...但在连接错误时,会者mysql_real_query()出现错误退出时,可能忘记mysql_close(); 所以在程序return 之前一定要判断是否close(),最稳妥的方法就是在写任何函数时都只有一个出口! 还有可以通

    基于C语言的工资管理系统

    2:程序一开始必须连接数据库,要掌握连接数据库的三个步骤:mysql_init()、mysql_options()、 mysql_real_connect()。在连接数据库的时候必须设定五个正确的参数,这些参数有主机地址、用户 名、用户密码、数据库...

    PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...

    主要介绍了PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...的相关资料,需要的朋友可以参考下

    Php中用PDO查询Mysql来避免SQL注入风险的方法

    当我们使用传统的 mysql_connect 、mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失去控制。虽然可以用mysql_real_escape_string()函数过滤用户提交的值,但是也有缺陷。而...

    PHP访问MySQL查询超时处理的方法

    目前两个客户端扩展库连接超时可以设置选项来操作,比如mysqli: 代码如下: <... //如果超时或者其他连接失败打印错误信息 if (mysqli_connect_errno()) { printf(“Connect failed: %s\n”, mysql

    PHP中mysqli_affected_rows作用行数返回值分析

    默认情况下mysqli_affected_rows返回的值为影响的行数,如果我们需要返回匹配的行数,可以使用mysqli_real_connect函数进行数据库连接的初始化,并在函数的flag参数位加上: MYSQLI_CLIENT_FOUND_ROWS return number of...

    PHP判断是否为空的几个函数对比

    您可能感兴趣的文章:PHP数字前补0的自带函数sprintf 和number_format的用法(详解)PHP常用函数总结(180多个)PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): …PHP中鲜为人知的...

Global site tag (gtag.js) - Google Analytics