使用sqlite内存不足的问题
我用sqlite3_exec执行插入语句,插入超过200次,就会有KERN-EXEC 3的错误,查看日志,应该是内存不足。下面是sqlite错误提示:
“database disk image is malformed”
"揶揶揶揶揶揶揶揶揶揶揶揶揶揶"
"out of memory"
在执行完sqlite3_exec后,怎么释放内存?
我每插完100次,就close掉,然后再打开,还是会有内存不足的错误,那位大牛有解决的办法?
[最优解释]
代码贴上来我看看。
[其他解释]
void CDbOperator::Insert(const char* aSqlString)
{
char* ptr ;
int result = sqlite3_exec(iDb,aSqlString,NULL,NULL,&ptr);
if(result != 0)
{
TRACE(ptr);//errors will be written into my log
}
}
我用sqlite3_exec执行插入语句,插入超过大约100次,过一会,就会有KERN-EXEC 3的错误,查看日志,应该是内存不足。
形参aSqlString ="INSERT INTO s_black_list_call (number,cat_id,region_code,intercept) VALUES ('19802301161','1','023','1');" 如此之类。
下面是sqlite3_exec执行后返回的错误提示(即日志里记录的ptr--TRACE(ptr);):
“database disk image is malformed”
"揶揶揶揶揶揶揶揶揶揶揶揶揶揶"
最后,在执行了大约1000次后,输出的错误为"out of memory"几次之后,直接KERN-EXEC 3的错误,程序退出。
查看数据库,里面被插入的只有200左右的数据。
后来,我每插完100次,就close掉,然后再打开,还是会有内存不足的错误。
然后,用hooklogger跟踪,是在mem1.cpp里有内存泄漏。
是不是在执行完sqlite3_exec后,要释放内存,要怎么释放内存?哪位大大有拯救俺的办法,请指教!
谢谢!
[其他解释]
本帖最后由 arthersophy 于 2011-06-21 16:19:20 编辑 首先,你对失败得操作不对。针对失败得操作,sqlite会把错误信息放在ptr里面得。也就是这个时候你需要手动释放ptr. 然后那个 KERN-EXEC 3,我估计是你得代码逻辑不严谨。 内存不足得情况下,你new一些对象实例就会失败,但是你在使用之前没有判空。所以导致 KERN-EXEC 3
void CDbOperator::Insert(const char* aSqlString)
{
char* ptr ;
int result = sqlite3_exec(iDb,aSqlString,NULL,NULL,&ptr);
if(result != 0)
{
TRACE(ptr);//errors will be written into my log
// add below free code
free(ptr);
}
}
下面是sqlite3_exec执行后返回的错误提示(即日志里记录的ptr--TRACE(ptr);):
“database disk image is malformed”
这个问题是因为你存得格式不对。BOLB格式得?你自己可以查一下。
[其他解释]
//{
//TUint8 blackType = array[i]->black_type +'0';
//TBuf8<64> sqlBuf(_L8("delete from s_black_list_call where cat_id = '"));
//sqlBuf.Append(blackType);
//sqlBuf.Append(_L8("';"));
//iDbOperator->Update(sqlBuf);
//}
if(array[i]->update_type == 0
[其他解释]
array[i]->update_type == 2)//新增
{
if(array[i]->black_mode = 1)//电话黑名单
{
strcpy(sqlBuf,"select number from s_black_list_call where number = '");
strcat(sqlBuf,array[i]->phone_num);
strcat(sqlBuf,"';");
iSqlObserverInUi = ETrue;
iDbOperator->Select(sqlBuf);
iSqlObserverInUi = EFalse;
if(iNumberDiscovered)
{
iNumberDiscovered = EFalse;
TRACE("The same number was found");
continue;
}
memset(sqlBuf,'\0',256);
strcpy(sqlBuf,"INSERT INTO s_black_list_call (number,cat_id,region_code,intercept) VALUES ('");
}
else
{
strcpy(sqlBuf,"INSERT INTO s_black_list_sms (number,cat_id,region_code,intercept) VALUES ('");
}
strcat(sqlBuf,array[i]->phone_num);
strcat(sqlBuf,"','");
sqlBuf[strlen(sqlBuf)] = array[i]->black_type +'0';
//strcat(sqlBuf,&(array[i]->black_type));
strcat(sqlBuf,"','");
strcat(sqlBuf,array[i]->area_code);
strcat(sqlBuf,"','1');");
iDbOperator->Insert(sqlBuf);
}
else//删除
{
}
}
以前不知道sqlite回调的那个ptr要释放。以前更新和插入100个以内是可以的,超过200个,打ptr:“database disk image is malformed”,再后来,会打印出out of memory的问题。而且使用sqlite,在select的时候没有内存泄露,在插入或更新的时候就有内存泄露。
[其他解释]
哦。这么多代码。。现在还有问题吗?
[其他解释]
[2011-06-22 04:20:56] 1010
[2011-06-22 04:20:56] out of memory
[2011-06-22 04:20:56] 1011
[2011-06-22 04:20:56] out of memory
[2011-06-22 04:20:56] 1012
[2011-06-22 04:20:56] out of memory
[2011-06-22 04:20:56] 1013
然后就是KERN-EXEC 3的错我。会不会是这样,在执行插入操作时,sqlite会开辟一些内存,但是它没有释放,插入600多条时,就会导致数据库因为内存不足而损坏,到out of memory时,已经接近或达到了程序被允许使用的内存最大值,所以使得sqlite没有办法再开辟内存,但是仍使用了那个指向没有成功开辟内存的指针(空指针),这样就导致 KERN-EXEC 3。
[其他解释]