自己写个了个小东西,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
分享到:
相关推荐
想用C++写项目,数据库是必须的,所以这两天学了一下C++操作MySQL数据库的方法。也没有什么教程,就是在网上搜的知识,下面汇总一下。...MYSQL *mysql_real_connect (MYSQL *mysql, const char *host,
* 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 449kb <br/>0 译者序 1 MySQL的一般的信息 1.1 什么是MySQL? 1.2 关于本手册 1.2.1 本手册中使用的约定 1.3 MySQL的历史 1.4 MySQL的主要特征 1.5...
使用mysql_real_connect()代替。 mysql_change_user() 改变在一个打开的连接上的用户和数据库。 mysql_create_db() 创建一个数据库。该函数不推荐;而使用SQL命令CREATE DATABASE。 mysql_data_seek() 在一...
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 ...
背景:把mysql换成mysqli时出现,连接数过多,其实际上并不是,原因是我挪动了一下php的sock文件位置导致,因这几个socket修改没有修改完全,于是出现了too many connections ,从mysql里show processlist并没有发现...
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 * 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); 第一个...
从官方文档知道linux上面编译安装的mysql默认的连接为100个,这样对于网站的需求来说是远远不够的。 mysql官方告诉我们需要修改max_connections的值,那么我们怎么去修改呢?有两种方法 1、修改配置文件文件 修改/etc...
MySQL数据库 Too many ...但在连接错误时,会者mysql_real_query()出现错误退出时,可能忘记mysql_close(); 所以在程序return 之前一定要判断是否close(),最稳妥的方法就是在写任何函数时都只有一个出口! 还有可以通
2:程序一开始必须连接数据库,要掌握连接数据库的三个步骤:mysql_init()、mysql_options()、 mysql_real_connect()。在连接数据库的时候必须设定五个正确的参数,这些参数有主机地址、用户 名、用户密码、数据库...
主要介绍了PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...的相关资料,需要的朋友可以参考下
当我们使用传统的 mysql_connect 、mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失去控制。虽然可以用mysql_real_escape_string()函数过滤用户提交的值,但是也有缺陷。而...
目前两个客户端扩展库连接超时可以设置选项来操作,比如mysqli: 代码如下: <... //如果超时或者其他连接失败打印错误信息 if (mysqli_connect_errno()) { printf(“Connect failed: %s\n”, mysql
默认情况下mysqli_affected_rows返回的值为影响的行数,如果我们需要返回匹配的行数,可以使用mysqli_real_connect函数进行数据库连接的初始化,并在函数的flag参数位加上: MYSQLI_CLIENT_FOUND_ROWS return number of...
您可能感兴趣的文章:PHP数字前补0的自带函数sprintf 和number_format的用法(详解)PHP常用函数总结(180多个)PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): …PHP中鲜为人知的...