c代码连接mysql数据库内存泄露的问题

一直使用C代码连接mysql数据库,今天用valgrind检测,发现存在内存泄露的问题

代码如下

MYSQL* connection;
connection = mysql_init();
connection = mysql_real_connect(connection,......);
mysql_query(.........);
mysql_close(connection);

在网上查了一番,找到如下解决方案

http://pipal.iteye.com/blog/903506

在mysal_close()后加入mysql_library_end()。

测试,发现仍然泄露。

无奈经过师兄点拨,再加上查询mysql的官网文档,发现mysql_real_connect()存在如下玄机:

Return Values

MYSQL* connection handle if the connection was successful, NULL if the connection was unsuccessful. For a successful connection, the return value is the same as the value of the first parameter.

意思如下,如果mysql_real_connect()连接成功,返回的指针式第一个参数一样,如果失败,返回NULL

我的代码里面connection首先指向mysql_init()返回的指针,之后又指向mysql_real_connect()的返回的指针,如果成功过的话,这两个指针式同样的,然而,在我的机子上,连接失败了,所以mysql_init()返回的指针丢失了,后续的close我释放的是NULL指针,丢失的指针没有释放,所以内存泄露

这是一个非主流的错误。

这件事警告我,永远不要把一个变量用过多种用途,尤其是指针,指针指向一个区域后千万不要改变,否则,很容易内存泄露,这也就是C++中引入引用的原因吧。

时间: 2024-11-07 17:55:33

c代码连接mysql数据库内存泄露的问题的相关文章

VS2017控制台应用中通过代码连接MySQL数据库

一,右键单击项目名称,选择属性 二,项目名->属性->c/c+±>常规->附加包含目录 添加路径:C:\Program Files\MySQL\MySQL Server 8.0\include(这个是默认路径,选择自己安装的位置即可) 三,链接器->常规->附加库目录 添加路径:C:\Program Files\MySQL\MySQL Server 8.0\lib(这个是默认路径,选择自己安装的路径即可) 四,链接器->输入->附加依赖项 添加:libmys

VS2017项目中使用代码连接MySQL数据库,以及进行数据添加

//头文件 #include "mysql.h" //函数定义 // 执行sql语句, 包括增加.删除.更新数据 bool ExecuteSql(MYSQL m_mysql,const char * sql) { if (mysql_query(&m_mysql, sql)) { // 打错误log,这里直接显示到控制台 cerr << "执行sql语句失败,错误信息为: " << mysql_error(&m_mysql)

python 3.5 连接mysql数据库

python 3.5 要连接mysql数据库,必须先安装pymysql模块,该模块可以操作mysql数据. 1.安装pymysql模块:使用pip进行安装 cmd打开运行模式,切换目录到pip的script目录下,后,输入pip install pymysql,enter键后,就会自己运行安装 2.写代码连接mysql数据库: 说明: ①import pymysql:导入刚才安装的pymysql模块,这时我们就可以调用该模块的函数来进行操作 ②con=pymysql.connect():调用py

Java连接MySQL数据库及简单操作代码

1.Java连接MySQL数据库 Java连接MySql需要下载JDBC驱动MySQL-connector-java-5.0.5.zip(举例,现有新版本).然后将其解压缩到任一目录.我是解压到D盘,然后将其目录下的MySQL-connector-java-5.0.5-bin.jar加到classpath里,具体如下: "我的电脑"-> "属性" -> "高级" -> "环境变量",在系统变量那里编辑clas

Unity3D 连接MySQL数据库笔记4-Unity3d代码

新建Unity3D项目 新建一个 Plugins文件夹 把所需要的DLL放到 Plugins中 新建C#脚本 命名为ToMysql.cs 不多说了 ,直接上代码,很简单  有注释 ,大家一看就明白了 using UnityEngine; using System; using System.Collections; using System.Data; using MySql.Data.MySqlClient; public class ToMysql : MonoBehaviour { pub

Java连接MySQL数据库——含步骤和代码

工具:eclipse MySQL5.6 MySQL连接驱动:mysql-connector-java-5.1.27.jar 加载驱动: 1. 在工程目录中创建lib文件夹,将下载好的JDBC放到该文件夹下,如下图所示: 2. 右键工程名,在java build path中的Libraries分页中选择Add JARs...,选择刚才添加的JDBC,如下图: 数据包准备: 在数据库sqltestdb中创建如下数据表emp: CREATE TABLE emp( empno INT(4) PRIMAR

C++连接mysql数据库的两种方法

现在正做一个接口,通过不同的连接字符串操作不同的数据库.要用到mysql数据库,以前没用过这个数据库,用access和sql server比较多.通过网上的一些资料和自己的摸索,大致清楚了C++连接mysql的方法.可以通过2种方法实现. 第一种方法是利用ADO连接, 第二种方法是利用mysql自己的api函数进行连接. 第一种方法可以实现我当前的需求,通过连接不同的字符串来连接不同的数据库.暂时只连接了mysql,sqlserver,oracle,access.对于access,因为它创建表的

用MyEclipse10.0远程连接Mysql数据库服务器

说明:本文档所有的操作均在满足以下条件的情况下操作, A.远程Linux服务器已经安装好MySQL数据库 B.本地电脑可以ping通远程服务器 C.已经成功安装了Myeclipse 一.下载mysql-connector-java-3.1.14-bin.jar 这个是连接mysql数据库的驱动器. 下载地址: http://dev.mysql.com/downloads/connector/j/5.0.html 也可以到官方网站下载,网址如下:www.mysql.com 二.在Myeclipse

Linux系统Java连接Mysql数据库

Linux系统下Java连接Mysql数据库方法与Windows下类似,具体步骤如下: 下载JDBC(驱动):mysql-connector-java-5.1.37.tar.gz 解压下载的数据包:tar -zxvf mysql-connector-java-5.1.37.tar.gz 解压后,mysql-connector-java-5.1.29-bin.jar位于mysql-connector-java-5.1.29目录下. 配置解压后,mysql-connector-java-5.1.29