当前位置:  技术问答>linux和unix

请教两段C代码,关于sqlite数据库操作的

    来源: 互联网  发布时间:2017-05-05

    本文导语:  使用valgrind进行内存泄漏,发现sqlite3_get_table处有泄漏,泄漏代码如下: void EXE_Send2Low_Ent() { char buf[1000];                             //数据库操作 char DataID[20];                          ...

使用valgrind进行内存泄漏,发现sqlite3_get_table处有泄漏,泄漏代码如下:
void EXE_Send2Low_Ent()
{
char buf[1000];                             //数据库操作
char DataID[20];                            //指令ID号
char OrderTxt[200]; //指令类容
nt_Table tb;  
sprintf( buf, "select * from Send2Low_Enterprise order by DataID ASC");   //获取数据库中第一条命令
if( SqlDbase( &tb, buf )  == -1){
return;                         //操作失败
}

if( (tb.row) == 0){                         //没有需要处理的命令      
return;
}
if((tb.row) > OrderMax_Ent){                //指令堆积,删除指令后退出
sprintf( buf, "delete from Send2Low_Enterprise");
ExecDbase(  buf );                //删除表中所有指令
return ;
}
strcpy(DataID, tb.result[2]);       //获取要处理指令的编号(第一条指令)
strcpy(OrderTxt,tb.result[3]); //获取要处理指令的内容

#ifdef DEBUG_TEST
printf("The EXE_Send2Low_Ent ID is %sn", DataID);
printf("The EXE_Send2Low_Ent OrderTxt is %sn", OrderTxt);
#endif

sprintf( buf, "delete from Send2Low_Enterprise where DataID = %s", DataID); 
if( ExecDbase(  buf ) ) {             //删除该条命令记录
return ;
}

sqlite3_free_table( tb.result );         //释放查询结果
EXE_Send2Low_Handle(OrderTxt);              //处理该命令
return;
}

int SqlDbase( nt_Table * tb, char * sql )
{
char *pErrMsg;
//nt_Table tb_t;
if(db.pdb == NULL)
{
return -1;
}

pthread_mutex_lock(&dbase_lock) ; // 数据库上锁
sqlite3_get_table(db.pdb, sql, &(tb->result), &(tb->row), &(tb->col), &pErrMsg);
pthread_mutex_unlock(&dbase_lock); // 数据库解锁

if(pErrMsg != NULL)
{
printf("error: sql %s, %sn", sql, pErrMsg );
sqlite3_free(pErrMsg);
//pErrMsg = NULL;
return -1;
}

return 0;
}



这两段函数实现了一个函数调用参数传递的过程,SqlDbase子函数里使用sqlite3_get_table后在EXE_Send2Low_Ent父函数里使用sqlite3_free_table进行了释放,理论上不应该在这里出现内存泄漏,但实际用valgrind检测还是会显示这里有内存泄漏,如下:
==10834== 1,168 bytes in 73 blocks are definitely lost in loss record 21 of 23
==10834== at 0x402C1C2: realloc (vg_replace_malloc.c:687)
==10834== by 0x4077233: sqlite3MemRealloc (sqlite3.c:15811)
==10834== by 0x4059D0C: sqlite3Realloc (sqlite3.c:19305)
==10834== by 0x40C8CAE: sqlite3_get_table (sqlite3.c:101462)
==10834== by 0x804DFC7: EXE_Send2Low_Ent (Send2Low_Enterprise.c:64)
==10834== by 0x804F344: CommRTU (RTU.c:61)
==10834== by 0x4103D77: start_thread (pthread_create.c:311)
==10834== by 0x435FFED: clone (clone.S:131)


我猜测是valgrind很“死板”只对单个函数内sqlite3_get_table和sqlite3_free_table是否配对进行检测,所以我修改代码如下:
int SqlDbase( nt_Table * tb, char * sql )
{
char *pErrMsg;
nt_Table tb_t;
if(db.pdb == NULL)
{
return -1;
}

pthread_mutex_lock(&dbase_lock) ; // 数据库上锁
sqlite3_get_table(db.pdb, sql, &(tb_t.result), &(tb_t.row), &(tb_t.col), &pErrMsg);
pthread_mutex_unlock(&dbase_lock); // 数据库解锁

if(pErrMsg != NULL)
{
printf("error: sql %s, %sn", sql, pErrMsg );
sqlite3_free(pErrMsg);
//pErrMsg = NULL;
return -1;
}

tb->result = tb_t.result;
tb->row = tb_t.row;
tb->col = tb_t.col;

sqlite3_free_table(tb_t.result);
return 0;
}

在子函数内直接重新定义结构体,在子函数内进行显示的释放,通过这种操作,再使用valgrind进行检测,果然发现没有内存泄漏了,但出现了另一个问题,在这里出现Segmentation fault (core dumped)错误!导致程序无法运行!
请各位大牛给点建议,谢谢!

|
valgrind误报?

    
 
 

您可能感兴趣的文章:

  • 到底怎么样的代码算是有效代码?请教了。。
  • 高分请教!Netscape浏览器的源代码公开了吗?从那里可以得到For linux的源代码?
  • 请教专家:如何在Unix下连接MS SqlServer。最好是有代码。能提供IODBC的相关资料代码也可以
  • 请教内核ppp代码的内容——在线等
  • 请教如何查看gFTP的源代码?
  • 请教该如何着手阅读jive代码?
  • 高分请教:redhat 的各种应用程序源代码放在哪儿?
  • 请教linux源代码阅读方法
  • 请教关于diff命令,代码?
  • 恳切请教:如何学习unix源代码
  • 请教一下调试GCC源代码问题
  • 请教查看linux源代码的方法?
  • 新手请教一段AWK代码,报错。
  • 请教:Linux下编译c代码,运行程序时出现undefined symbol exp
  • 请教,谁有银行金额小写转大写的代码?
  • 请教如下代码
  • 请教参考代码0c9代表什么意思?
  • shell小程序代码请教!急!!!!!!
  • 关于socket通信,C的代码,有个问题请教高手!
  • 请教:如何实现点击一个image后,该image在Applet中移动位置?有示例代码吗?谢谢!!!
  • 各位大虾,请教装了REDHAT9操作系统后,启动时无法引导到LINUX,请教该如何解决啊
  • linux中同步与原子操作的相关知识辨析【请教高手】
  • 请教,如何使用JDOM操作XML文档?
  • 请教unix操作命令
  • 操作系统简单问题请教
  • 请教:关于linux操作系统裁剪
  • 请教:怎样对并口进行读、写操作?
  • 请教该如何着手阅读jive代码? iis7站长之家
  • 请教:文件cp操作
  • 请教裁剪操作系统时,共享库的裁剪
  • Vxworks 嵌入式操作系统入门请教,请多指点!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教,请教,这个问题是为什么????
  • 请教本地硬盘安装问题请教本地硬盘安装问题
  • ■请教■请教redhat最基本的问题!
  • 请教一个 shell 问题,我用下面这个 shell 语句总是失败,请教
  • 高分请教,各位大侠,请教一个问题,理论高手请进??谢谢
  • 请教Linux下pgadmin3-1.0.2的编译和安装!!高分请教!
  • 请教,请教,,,一定要看!!一定要看!!
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教象我这样的硬盘应如何安装Linux,我昨天试装了,但有问题。(老问题了,也看了前面的帖子,但还是来请教,请多指教)
  • 请教这种循环的执行过程
  • 请教两个redhat9问题
  • 请教如何在指定目录下查找包含指定文字的文件
  • 请教局域网中如何通过ip地址得到主机名
  • 请教kdevelop的问题
  • 请教linux 下的adsl拨号问题.
  • 请教,如何用虚拟订机安装liux
  • 【请教】LINUX 下SNMP的MIB开发
  • 请教一个opengl的问题
  • 请教unix常用命令命令问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,