自己写个了个小东西,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
分享到:
相关推荐
然后,使用`mysql_init()`初始化这个结构体,接着用`mysql_real_connect()`建立连接。例如: ```cpp MYSQL* conn; conn = mysql_init(NULL); if (!mysql_real_connect(conn, "localhost", "username", "password", ...
这个API包含了一系列的函数,如mysql_init()用于初始化一个连接结构体,mysql_real_connect()用于建立到服务器的连接,mysql_query()用于执行SQL查询,以及mysql_store_result()和mysql_fetch_row()用于处理查询结果...
2. **MYSQL_connect驱动**:在C语言中,`mysql_connect()`函数是用于连接MySQL服务器的一个老式接口,它已经不再推荐使用,但在这里可能作为示例被提及。新版本的API推荐使用`mysql_real_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 c mysql_linux mys"的压缩包中,包含了一个名为"MYSQL.txt"的文本文件,它很可能提供了关于C或C++编程语言与MySQL数据库进行连接和查询的实例代码。 首先,让我们...
首先安装`libmysqlclient`库,然后在代码中包含头文件`<mysql.h>`,通过`mysql_init()`, `mysql_real_connect()`, `mysql_query()`, `mysql_store_result()`等函数进行数据库交互。 8. **安全实践** 为了保障...
4. **连接管理**:在Linux环境下,通过C语言连接MySQL数据库,需要使用`mysql_library_init()`初始化MySQL库,然后用`mysql_init()`和`mysql_real_connect()`建立连接。连接参数通常包括服务器地址、端口、用户名、...
1. **连接管理**:`mysql_init()`用于初始化一个MySQL结构体,`mysql_real_connect()`用于建立到MySQL服务器的连接。`mysql_close()`则用于关闭已建立的连接。 2. **错误处理**:当发生错误时,`mysql_error()`返回...
首先,我们需要调用`mysql_init()`函数初始化一个`MYSQL`结构体实例,然后使用`mysql_real_connect()`函数连接到服务器。连接参数包括主机名、用户名、密码和数据库名。例如: ```c MYSQL *conn; conn = mysql_init...
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 接口中的三个主要函数:mysql_init()、mysql_real_connect() 和 mysql_real_query()。 一、mysql_init() 函数 mysql_init() 函数用于分配或初始化适合 mysql_real_connect() 的 MYSQL 对象。...
4. **连接函数**:讲解如何使用C API(如`mysql_init()`, `mysql_real_connect()`等)或C++ API(如`mysql::Connection`类)创建和管理数据库连接。 5. **SQL操作**:示例代码展示如何执行SQL查询,如`mysql_query...
开发者可以通过包含这个头文件来使用MySQL的API接口,如`mysql_init()`, `mysql_real_connect()`, `mysql_query()`等函数,这些函数允许创建和管理数据库连接,执行SQL查询,以及处理结果集。 其次,`mysqlclient....
1. **连接管理**:创建和管理数据库连接,这通常涉及使用`mysql_real_connect()`函数,传入服务器地址、用户名、密码、数据库名等参数。 2. **SQL查询**:通过`mysql_query()`函数发送SQL语句到服务器,如SELECT、...
3. `mysql_include`目录:通常,这个目录包含了所有必要的头文件,如`mysql.h`,这是主入口点,定义了大部分的MySQL C API函数,如`mysql_init`(初始化MySQL连接)、`mysql_real_connect`(建立到服务器的连接)、`...
在C程序中,可以使用`mysql_init()`函数初始化一个MySQL连接结构体,然后通过`mysql_real_connect()`连接到服务器。连接参数包括主机名、用户名、密码和数据库名: ```c MYSQL *conn = mysql_init(NULL); if (!...
使用`mysql_real_connect()`函数建立到MySQL服务器的连接。这里的参数包括: - `conn_ptr`: 已初始化的MySQL结构体指针。 - `localhost`: 数据库服务器地址。 - `root`: 用户名。 - `root`: 密码。 - `test`: 要连接...
在处理用户输入的数据并将其插入到 SQL 查询时,这是一个非常重要的步骤,因为不正确的数据编码可能导致严重的安全问题,比如数据泄露或者恶意操作。然而,需要注意的是,`mysql_escape_string()` 在 PHP 5.3 版本...
- `mysql_store_result()`:如果查询返回结果集,此函数将结果存储在内存中,返回结果集对象。 - `mysql_use_result()`:与`mysql_store_result()`类似,但不存储所有结果,而是按需读取。 3. **处理结果集**: ...
首先,为了连接到MySQL服务器,我们需要包含`mysql.h`头文件,并使用`mysql_init()`初始化一个`MYSQL`结构体实例,然后用`mysql_real_connect()`建立连接。连接参数包括服务器地址、端口号、用户名、密码和数据库名...