今天发现使用了很久的SQLite3原来忘记释放返回错误信息的buffer了!汗!

原创 2007年09月12日 14:58:00
今天对程序进程内存泄漏检查发现: Detected memory leaks! Dumping objects -> {814} normal block at 0x0370AFD0, 40 bytes long. Data: 74 61 62 6C 65 20 54 61 62 6C 65 5F 53 74 72 61 Object dump complete.
如果你写的程序没有返回错误信息,那么不应该会有泄漏!
 我的源代码:
 if (result == SQLITE_OK)
 {
char *errmsg = NULL;
int nError = sqlite3_exec( m_sqlite3DB, "create table Table_StrangeWords( ID integer primary key autoincrement, name nvarchar(32) ,)", NULL, NULL, &errmsg ); if(nError != SQLITE_OK)
 {
 ATLTRACE( "创建表失败,错误码:%d,错误原因:%s/n", result, errmsg );
} //else cont.
}
跟了一下SQLite3的代码:
if( pStmt ) sqlite3_finalize(pStmt);
 if( azCols ) sqliteFree(azCols);
rc = sqlite3ApiExit(0, rc);
if( rc!=SQLITE_OK && rc==sqlite3_errcode(db) && pzErrMsg )
{
int nErrMsg = 1 + strlen(sqlite3_errmsg(db));
*pzErrMsg = sqlite3_malloc(nErrMsg); //这里进行申请buffer,如果不释放那漏洞大大的。
 if( *pzErrMsg )
{
memcpy(*pzErrMsg, sqlite3_errmsg(db), nErrMsg);
}
}
else if( pzErrMsg )
{
*pzErrMsg = 0;
}
assert( (rc&db->errMask)==rc );

改正后的代码:
if (result == SQLITE_OK)
 {
char *errmsg = NULL;
int nError = sqlite3_exec( m_sqlite3DB, "create table Table_StrangeWords( ID integer primary key autoincrement, name nvarchar(32) ,)", NULL, NULL, &errmsg ); if(nError != SQLITE_OK)
 {
ATLTRACE( "创建表失败,错误码:%d,错误原因:%s/n", result, errmsg );
}
//else cont.
//close
if(errmsg != NULL)
 {
sqlite3_free(errmsg); //这里需要用sqlite3_free去free,切忌!
 } //else cont.
 }
sqlite把内存管理自己封装起来,可不能随便delete这个buffer,遇到问题最好看看它的代码!
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

<C/C++算法>动态规划练习与小结

一,关于“动态规划”的学习建议: Here is my answer in similar topic Start with wikipedia article about dynamic pr...

sqlite的几个常用方法

转载:http://www.cnblogs.com/kfqcome/archive/2011/06/27/2136999.html 一.使用流程 要使用sqlite,需要从sqlite官网下载到三...

全排列算法及实现

全排列在很多程序都有应用,是一个很常见的算法,常规的算法是一种递归的算法,这种算法的得到基于以下的分析思路。  给定一个具有n个元素的集合(n>=1),要求输出这个集合中元素的所有可能的排列。    ...

全排列生成算法(一)

对于给定的集合A{a1,a2,...,an},其中的n个元素互不相同,如何输出这n个元素的所有排列(全排列)。 递归算法 这里以A{a,b,c}为例,来说明全排列的生成方法,对于这个集合,其包含3...

sqlite内存泄漏解决办法

sqlite内存泄漏解决办法   2012-09-26 13:54:54|  分类: 默认分类 |举报 |字号 订阅 用cppsqlite发生内存泄漏,最后发现是把事物...
  • lcjwxd
  • lcjwxd
  • 2014-11-14 10:11
  • 2426

sqlite 内存泄露解决方法

近日在项目中使用sqlite3作数据库,在开发的过程中,无论使用文件库还是内存库总会发生内存泄露的问题。 经过查找及在网上寻找解决方案,总结解决方法如下: 1. 在使用 sqlite3_get_...

使用PowerShell远程执行指令后返回执行或错误信息

算是对之前做的Powershell远程执行指令的一些改进优化,由于之前返回信息只能在发送的命令行后面加上 $? 来判定命令的是否执行成功,返回的只有false或者true,亦或者是返回一些奇怪的数组类...

使用@ControllerAdvice实现发生异常时返回json错误信息

前言本文介绍spring MVC的自定义异常处理,即在Controller中抛出自定义的异常时,客户端收到更友好的JSON格式的提示,而不是常见的报错页面,方便移动端的处理。 注解介绍@Contro...

使用spring webflow,在前台页面中如何显示后端返回的错误信息

刚刚接触spring webflow,相关的资料并不是很多,并且大都是那种入门的 .xml文件的配置。 用到的CAS 最新的4.0版本用的就是web-flow流,前台页面使用的是表单提交。于是我就碰到...

配置错误:未能使用提供程序“RsaProtectedConfigurationProvider”进行解密。提供程序返回错误信息为: 打不开 RSA 密钥容器。

我们如果想对web.config的数据库连接字符串进行加密的话,那么这里提供了两个方法。 方法一、     使用“DataProtectionConfigurationProvider”形式加密,创建...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)