`
pipal
  • 浏览: 166209 次
  • 性别: 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_connect_mysql.rar_c mysql linux_connect_linux mysql_my

    然后,使用`mysql_init()`初始化这个结构体,接着用`mysql_real_connect()`建立连接。例如: ```cpp MYSQL* conn; conn = mysql_init(NULL); if (!mysql_real_connect(conn, "localhost", "username", "password", ...

    linux_mysql.rar_c mysql linux_linux mysql_linux mysql_linux m

    这个API包含了一系列的函数,如mysql_init()用于初始化一个连接结构体,mysql_real_connect()用于建立到服务器的连接,mysql_query()用于执行SQL查询,以及mysql_store_result()和mysql_fetch_row()用于处理查询结果...

    C_link_mysql.zip_C MYSQL_c++ mysql_connect_mysql c#_mysql c++

    2. **MYSQL_connect驱动**:在C语言中,`mysql_connect()`函数是用于连接MySQL服务器的一个老式接口,它已经不再推荐使用,但在这里可能作为示例被提及。新版本的API推荐使用`mysql_real_connect()`,因为它提供了更...

    mysql-connect.zip_C MYSQL_c mysql_c++ mysql_connect

    例如,我们可以使用智能指针(如`std::unique_ptr`)来自动管理`MYSQL`对象的生命周期,防止内存泄漏。 ```cpp #include std::unique_ptr<MYSQL, decltype(&mysql_free)> conn(mysql_init(nullptr), mysql_free);...

    MYSQL.zip_C MYSQL_c++ mysql_linux mysql_linux c mysql_linux mys

    在这个名为"MYSQL.zip_C MYSQL_c++ mysql_linux c mysql_linux mys"的压缩包中,包含了一个名为"MYSQL.txt"的文本文件,它很可能提供了关于C或C++编程语言与MySQL数据库进行连接和查询的实例代码。 首先,让我们...

    mysql.rar_MYSQL_linux c mysql_linux mysql_mysql linux_mysql 操作

    首先安装`libmysqlclient`库,然后在代码中包含头文件`<mysql.h>`,通过`mysql_init()`, `mysql_real_connect()`, `mysql_query()`, `mysql_store_result()`等函数进行数据库交互。 8. **安全实践** 为了保障...

    CSQL.rar_ CSQL_CSQL_MYSQL改_linux c mysql_linux mysql增删

    4. **连接管理**:在Linux环境下,通过C语言连接MySQL数据库,需要使用`mysql_library_init()`初始化MySQL库,然后用`mysql_init()`和`mysql_real_connect()`建立连接。连接参数通常包括服务器地址、端口、用户名、...

    MySQL_C_API.rar_API_mysql_doc_mysql api_mysql c语言

    1. **连接管理**:`mysql_init()`用于初始化一个MySQL结构体,`mysql_real_connect()`用于建立到MySQL服务器的连接。`mysql_close()`则用于关闭已建立的连接。 2. **错误处理**:当发生错误时,`mysql_error()`返回...

    mysql.rar_c mysql_c++ mysql_mysql c_window mysql

    首先,我们需要调用`mysql_init()`函数初始化一个`MYSQL`结构体实例,然后使用`mysql_real_connect()`函数连接到服务器。连接参数包括主机名、用户名、密码和数据库名。例如: ```c MYSQL *conn; conn = mysql_init...

    mysql.rar_MySQL Visual C++_MySql查询_c语言mysql_mysql c语言_mysql操作

    if (mysql_real_connect(conn, server, user, password, database, 0, NULL, 0) == NULL) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(1); } ``` 在连接成功后,你可以使用`mysql_query()`函数执行SQL...

    MySql接口1

    下面将详细介绍 MySql 接口中的三个主要函数:mysql_init()、mysql_real_connect() 和 mysql_real_query()。 一、mysql_init() 函数 mysql_init() 函数用于分配或初始化适合 mysql_real_connect() 的 MYSQL 对象。...

    win32-DevC-mysql.zip_C MYSQL_MYSQL_c mysql_dev c++ _mysql c++

    4. **连接函数**:讲解如何使用C API(如`mysql_init()`, `mysql_real_connect()`等)或C++ API(如`mysql::Connection`类)创建和管理数据库连接。 5. **SQL操作**:示例代码展示如何执行SQL查询,如`mysql_query...

    mysql_lib.rar_C MYSQL_MYSQL_c mysql_mysql.l_vc++和MySQL

    开发者可以通过包含这个头文件来使用MySQL的API接口,如`mysql_init()`, `mysql_real_connect()`, `mysql_query()`等函数,这些函数允许创建和管理数据库连接,执行SQL查询,以及处理结果集。 其次,`mysqlclient....

    MySQL.rar_MYSQL_mysql vc_vc mysql

    1. **连接管理**:创建和管理数据库连接,这通常涉及使用`mysql_real_connect()`函数,传入服务器地址、用户名、密码、数据库名等参数。 2. **SQL查询**:通过`mysql_query()`函数发送SQL语句到服务器,如SELECT、...

    mysql_include.rar_mysql include_mysql_include_mysql_time.h_mysql

    3. `mysql_include`目录:通常,这个目录包含了所有必要的头文件,如`mysql.h`,这是主入口点,定义了大部分的MySQL C API函数,如`mysql_init`(初始化MySQL连接)、`mysql_real_connect`(建立到服务器的连接)、`...

    MySQL-operation-using-C-language.zip_MYSQL_mysql linux_mysql mfc

    在C程序中,可以使用`mysql_init()`函数初始化一个MySQL连接结构体,然后通过`mysql_real_connect()`连接到服务器。连接参数包括主机名、用户名、密码和数据库名: ```c MYSQL *conn = mysql_init(NULL); if (!...

    linux_下_C_语言_连接_MySQL数据库_(详细注释).txt

    使用`mysql_real_connect()`函数建立到MySQL服务器的连接。这里的参数包括: - `conn_ptr`: 已初始化的MySQL结构体指针。 - `localhost`: 数据库服务器地址。 - `root`: 用户名。 - `root`: 密码。 - `test`: 要连接...

    mysql_escape_string()函数用法分析

    在处理用户输入的数据并将其插入到 SQL 查询时,这是一个非常重要的步骤,因为不正确的数据编码可能导致严重的安全问题,比如数据泄露或者恶意操作。然而,需要注意的是,`mysql_escape_string()` 在 PHP 5.3 版本...

    MYSQL_C_API.rar_MYSQL_mysql c++

    - `mysql_store_result()`:如果查询返回结果集,此函数将结果存储在内存中,返回结果集对象。 - `mysql_use_result()`:与`mysql_store_result()`类似,但不存储所有结果,而是按需读取。 3. **处理结果集**: ...

    mysql_test_c__by_wy.rar_MYSQL_mysql api_mysql c++

    首先,为了连接到MySQL服务器,我们需要包含`mysql.h`头文件,并使用`mysql_init()`初始化一个`MYSQL`结构体实例,然后用`mysql_real_connect()`建立连接。连接参数包括服务器地址、端口号、用户名、密码和数据库名...

Global site tag (gtag.js) - Google Analytics