mysql mysql_real_connect 内存泄露

本文介绍了一个使用C语言在Linux环境下操作MySQL数据库的测试程序,并通过valgrind检测到内存泄漏的问题。文章详细记录了内存泄漏的具体位置,并提供了解决方案:在mysql_close之后调用mysql_library_end()关闭MySQL库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://blog.youkuaiyun.com/weihua1984/archive/2010/08/24/5835731.aspx

linux 下使用c操作mysql数据库时写个测试程序

  1. int main(void)  
  2. {  
  3.     MYSQL m_mysql;  
  4.     mysql_init(&m_mysql);  
  5.       
  6.     const char pLocalhost[] = "localhost";  
  7.     const char pUser[] = "root";  
  8.     const char pPass[] = "123456";  
  9.     const char pDB[] = "HTTPCONTROL";  
  10.       
  11.     if(mysql_real_connect(&m_mysql,pLocalhost,pUser,pPass,pDB,0,NULL,0) == NULL)  
  12.         cout<<"connect failed"<<endl;  
  13.     else  
  14.         cout<<"connect success"<<endl;  
  15.        
  16.     mysql_close(&m_mysql);      
  17.     return 0;  
  18. }  

编译后使用valgrind检测内存泄露

[root@localhost string]# valgrind --tool=memcheck --leak-check=full ./mysql 
==10352== Memcheck, a memory error detector
==10352== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==10352== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info
==10352== Command: ./mysql
==10352== 
connect success
==10352== 
==10352== HEAP SUMMARY:
==10352==     in use at exit: 61,336 bytes in 16 blocks
==10352==   total heap usage: 118 allocs, 102 frees, 115,929 bytes allocated
==10352== 
==10352== 24,528 bytes in 6 blocks are possibly lost in loss record 4 of 5
==10352==    at 0x4005903: malloc (vg_replace_malloc.c:195)
==10352==    by 0x30DD75: my_once_alloc (in /usr/lib/mysql/libmysqlclient.so.15.0.0)
==10352==    by 0x30E59C: ??? (in /usr/lib/mysql/libmysqlclient.so.15.0.0)
==10352==    by 0x30EF96: ??? (in /usr/lib/mysql/libmysqlclient.so.15.0.0)
==10352==    by 0x30F111: get_charset_by_csname (in /usr/lib/mysql/libmysqlclient.so.15.0.0)
==10352==    by 0x32C3D2: mysql_init_character_set (in /usr/lib/mysql/libmysqlclient.so.15.0.0)
==10352==    by 0x32DABB: mysql_real_connect (in /usr/lib/mysql/libmysqlclient.so.15.0.0)
==10352==    by 0x8048A76: main (str.cpp:32)
==10352== 
==10352== 28,616 bytes in 7 blocks are possibly lost in loss record 5 of 5
==10352==    at 0x4005903: malloc (vg_replace_malloc.c:195)
==10352==    by 0x30DD75: my_once_alloc (in /usr/lib/mysql/libmysqlclient.so.15.0.0)
==10352==    by 0x30E57A: ??? (in /usr/lib/mysql/libmysqlclient.so.15.0.0)
==10352==    by 0x30EF96: ??? (in /usr/lib/mysql/libmysqlclient.so.15.0.0)
==10352==    by 0x30F111: get_charset_by_csname (in /usr/lib/mysql/libmysqlclient.so.15.0.0)
==10352==    by 0x32C3D2: mysql_init_character_set (in /usr/lib/mysql/libmysqlclient.so.15.0.0)
==10352==    by 0x32DABB: mysql_real_connect (in /usr/lib/mysql/libmysqlclient.so.15.0.0)
==10352==    by 0x8048A76: main (str.cpp:32)
==10352== 
==10352== LEAK SUMMARY:
==10352==    definitely lost: 0 bytes in 0 blocks
==10352==    indirectly lost: 0 bytes in 0 blocks
==10352==      possibly lost: 53,144 bytes in 13 blocks
==10352==    still reachable: 8,192 bytes in 3 blocks
==10352==         suppressed: 0 bytes in 0 blocks
==10352== Reachable blocks (those to which a pointer was found) are not shown.
==10352== To see them, rerun with: --leak-check=full --show-reachable=yes
==10352== 
==10352== For counts of detected and suppressed errors, rerun with: -v
==10352== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 3

还是网上找最后找到了

http://dev.mysql.com/doc/refman/5.0/en/mysql-library-end.html

简单的说是在断开数据库连接后使用

mysql_library_end()

关闭MYSQL 使用的库

即在mysql_close(。。。)

后添加

mysql_library_end();

就ok了

再添加一句,在使用mysql API之前最好是

调用mysql_library_init(。。。。)

转载于:https://www.cnblogs.com/talking/archive/2011/04/14/2015887.html

MySQL是一种常用的关系型数据库管理系统,mysql_real_connect()是MySQL C API提供的一个函数,用于建立与MySQL服务器的连接。下面是mysql_real_connect()函数的用法: ``` MYSQL *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:已经初始化的MYSQL结构体指针,用于存储连接和查询结果。 - host:MySQL服务器的主机名或IP地址。 - user:连接MySQL服务器的用户名。 - passwd:连接MySQL服务器的密码。 - db:连接MySQL服务器后要使用的数据库名。 - port:MySQL服务器连接端口,默认为3306。 - unix_socket:UNIX域套接字文件路径。 - clientflag:用于设置连接选项。 函数返回一个MYSQL结构体指针,代表与MySQL服务器的连接。连接建立成功时返回非空指针,否则返回空指针。 下面是一个建立与MySQL服务器连接的示例: ``` #include <mysql.h> #include <stdio.h> int main() { MYSQL *conn; char *host = "localhost"; char *user = "root"; char *password = "123456"; char *database = "test"; conn = mysql_init(NULL); if (!conn) { printf("MySQL initialization failed!\n"); return 1; } conn = mysql_real_connect(conn, host, user, password, database, 0, NULL, 0); if (conn) { printf("MySQL connection succeeded!\n"); } else { printf("MySQL connection failed!\n"); } mysql_close(conn); return 0; } ``` 在这个示例中,我们使用mysql_init()函数初始化一个MYSQL结构体指针,然后使用mysql_real_connect()函数建立与MySQL服务器的连接。如果连接建立成功,则输出"MySQL connection succeeded!",否则输出"MySQL connection failed!"。最后使用mysql_close()函数关闭与MySQL服务器的连接。 希望这个示例能够帮助你理解mysql_real_connect()函数的用法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值