我用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格式得?你自己可以查一下。
------其他解决方案--------------------------------------------------------
谢谢胡兄的回复!下面是我调用void CDbOperator::Insert(const char* aSqlString)的代码:
for(TInt i = 0; i < arrayCount; i ++)
{
char sqlBuf[256];
memset(sqlBuf,'\0',256);
TBuf<8> tempBuf;
tempBuf.AppendNum(i);
TRACE(tempBuf);
// if(array[i]->update_type == 2)//全量