0

0

MySQL C 客户端的内存泄漏问题

php中文网

php中文网

发布时间:2016-06-01 13:16:10

|

1610人浏览过

|

来源于php中文网

原创

用valgrind测试 mysql的c客户端mysqlclient发现,它在正常的使用中会被valgrind报出存在内存泄漏。

1 正常使用场景

下面的代码是使用mysqlclient读取数据的最常用的代码

#include #include int main(){	MYSQL	 *conn;	MYSQL_RES *result;	MYSQL_ROW	row;	char		*w;	conn = mysql_init(NULL);	mysql_real_connect(conn, "127.0.0.1", "root", "", "db_test", 3306, NULL, 0);	mysql_query(conn, "select id from test");	result = mysql_store_result(conn);	if (result == NULL) {		printf("%d:%s/n", mysql_errno(conn), mysql_error(conn));		goto out;	}	while ((row = mysql_fetch_row(result))) {		w = row[0];	} out:	mysql_free_result(result);	mysql_close(conn);	mysql_library_end();	return 0;}

上面的代码用valgrind检测内存泄漏输出如下:

cobbliu@ubuntu:~/dev/test$ gcc -o mysql mysql.c -lmysqlclientcobbliu@ubuntu:~/dev/test$ valgrind --leak-check=full --show-reachable=yes ./mysql==4497== Memcheck, a memory error detector==4497== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.==4497== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info==4497== Command: ./mysql==4497====4497====4497== HEAP SUMMARY:==4497== in use at exit: 73,872 bytes in 21 blocks==4497== total heap usage: 84 allocs, 63 frees, 128,626 bytes allocated==4497==##这儿忽略了一部分输出#==4497== LEAK SUMMARY:==4497==definitely lost: 0 bytes in 0 blocks==4497==indirectly lost: 0 bytes in 0 blocks==4497==possibly lost: 0 bytes in 0 blocks==4497==still reachable: 73,872 bytes in 21 blocks==4497== suppressed: 0 bytes in 0 blocks==4497====4497== For counts of detected and suppressed errors, rerun with: -v==4497== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

可以看出,在正常的使用场景下,mysqlclient有一部分内存在 mysql_close() 之后并没有被释放。

2 解决方法

stackoverflow上的一篇文章提出了解决方法:在 mysql_close() 之后调用 mysql_library_end() 来释放 剩余的内存空间 MySQL开发手册对 mysql_library_end() 的描述如下:

This function finalizes the MySQL library.Call it when you are done using the library (for example, after disconnecting from the server).The action taken by the call depends on whether your application is linked to the MySQL client library or the MySQL embedded server library.For a client program linked against the libmysqlclient library by using the -lmysqlclient flag, mysql_library_end() performs some memory management to clean up.

3 效果检验

在上面的示例代码中加入 mysql_library_end() 函数:

//codes mysql_free_result(result);mysql_close(conn); mysql_library_end();// codes

然后用valgrind检测内存泄漏:

Sapling AI Content Detector
Sapling AI Content Detector

Sapling.ai推出的免费在线AI内容检测工具

下载
cobbliu@ubuntu:~/dev/test$ valgrind --leak-check=full --show-reachable=yes ./mysql==4513== Memcheck, a memory error detector==4513== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.==4513== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info==4513== Command: ./mysql==4513====4513====4513== HEAP SUMMARY:==4513== in use at exit: 0 bytes in 0 blocks==4513== total heap usage: 84 allocs, 84 frees, 128,626 bytes allocated==4513====4513== All heap blocks were freed -- no leaks are possible==4513====4513== For counts of detected and suppressed errors, rerun with: -v==4513== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

可以看出,已经没有未释放的内存了。

所以对于daemon进程,如果频繁地调用 mysql_init  mysql_close 的话,记得在 mysql_close 之后调用 mysql_library_end() 来释放未被释放的内存

Author: CobbLiu 

Date: 2014-05-05 13:42:21 CST

HTML generated by org-mode 6.33x in emacs 23

相关专题

更多
Word 字间距调整方法汇总
Word 字间距调整方法汇总

本专题整合了Word字间距调整方法,阅读下面的文章了解更详细操作。

2

2025.12.24

任务管理器教程
任务管理器教程

本专题整合了任务管理器相关教程,阅读下面的文章了解更多详细操作。

2

2025.12.24

AppleID格式
AppleID格式

本专题整合了AppleID相关内容,阅读专题下面的文章了解更多详细教程。

0

2025.12.24

csgo视频观看入口合集
csgo视频观看入口合集

本专题整合了csgo观看入口合集,阅读下面的文章了知道更多入口地址。

29

2025.12.24

yandex外贸入口合集
yandex外贸入口合集

本专题汇总了yandex外贸入口地址,阅读下面的文章了解更多内容。

58

2025.12.24

添加脚注通用方法
添加脚注通用方法

本专题整合了添加脚注方法合集,阅读专题下面的文章了解更多内容。

1

2025.12.24

重启电脑教程汇总
重启电脑教程汇总

本专题整合了重启电脑操作教程,阅读下面的文章了解更多详细教程。

3

2025.12.24

纸张尺寸汇总
纸张尺寸汇总

本专题整合了纸张尺寸相关内容,阅读专题下面的文章了解更多内容。

5

2025.12.24

Java Spring Boot 微服务实战
Java Spring Boot 微服务实战

本专题深入讲解 Java Spring Boot 在微服务架构中的应用,内容涵盖服务注册与发现、REST API开发、配置中心、负载均衡、熔断与限流、日志与监控。通过实际项目案例(如电商订单系统),帮助开发者掌握 从单体应用迁移到高可用微服务系统的完整流程与实战能力。

1

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 769人学习

ThinkPHP6.x 微实战--十天技能课堂
ThinkPHP6.x 微实战--十天技能课堂

共26课时 | 1.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号