使用valgrind检测到sqlite3.c内存泄漏,怎么办?
软件使用sqlite数据库进行数据存储,程序运行后打开并初始化数据库,因为是服务软件之后数据库就一直处于打开状态。是不是没有关闭数据库导致内存泄漏?请大牛们指点一下!谢谢!
[解决办法]
init没close怎么可能不泄漏。
[解决办法]
那不是泄露,比如,你动态分配一块内存,生命周期同程序,不能释放,这能是泄露吗?
[解决办法]
让程序按照你的想法运行几次,但不是一直运行.
main
{
a=malloc
while(1){
使用 a....
}
// 这里不释放,或者一大堆代码自己也不知道有没有释放,才需要valgrind嘛
// 程序结束,"自然"/被动释放.这不一定是好方式
}
改成这样,有意的运行几次意思意思,而不是永久.
main
{
a=malloc //申请
i=10;
while(i--){
使用a ...
}
free a //显示的释放必要的资源
}
这样,在用valgrind测试,还说有漏,
那么就应该while中有问题了.这样排查起来就目的明确多了.
再看看程序是否按照你的意愿malloc/free
谢谢,按照您的方法,我设置程序只运行2分钟然后自动关闭,释放资源,之前内存泄漏的地方是少了很多,现在出现的一个内存泄漏信息如下:
==5809== 1,216 bytes in 76 blocks are definitely lost in loss record 21 of 23
==5809== at 0x402C1C2: realloc (vg_replace_malloc.c:687)
==5809== by 0x4077233: sqlite3MemRealloc (sqlite3.c:15811)
==5809== by 0x4059D0C: sqlite3Realloc (sqlite3.c:19305)
==5809== by 0x40C8CAE: sqlite3_get_table (sqlite3.c:101462)
==5809== by 0x804A1DB: SqlDbase (dbase.c:211)
==5809== by 0x804DF49: EXE_Send2Low_Ent (Send2Low_Enterprise.c:54)
==5809== by 0x804F2CC: CommRTU (RTU.c:61)
==5809== by 0x4103D77: start_thread (pthread_create.c:311)
==5809== by 0x435FFED: clone (clone.S:131)
显示sqlite3_get_table处有内存泄漏,在我的代码里如下:
void EXE_Send2Low_Ent()
{
。。。
if( SqlDbase( &tb, buf ) == -1){
return; //操作失败
}
。。。
sqlite3_free_table( tb.result );
}
int SqlDbase( nt_Table * tb, char * sql )
{
。。。
pthread_mutex_lock(&dbase_lock) ;
sqlite3_get_table(db.pdb, sql, &(tb->result), &(tb->row), &(tb->col), &pErrMsg);
pthread_mutex_unlock(&dbase_lock);
。。。
}
通过指针参数的方式在子函数里调用sqlite3_get_table获取数据,然后使用数据后进行free,按理说这样不会出现内存泄漏啊。。。。大哥可知道是什么原因,或者什么好的查找原因的方法?