首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Symbian >

使用sqlite内存不足的有关问题

2012-12-14 
使用sqlite内存不足的问题我用sqlite3_exec执行插入语句,插入超过200次,就会有KERN-EXEC 3的错误,查看日志

使用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格式得?你自己可以查一下。

[其他解释]

引用:
首先,你对失败得操作不对。针对失败得操作,sqlite会把错误信息放在ptr里面得。也就是这个时候你需要手动释放ptr. 然后那个 KERN-EXEC 3,我估计是你得代码逻辑不严谨。 内存不足得情况下,你new一些对象实例就会失败,但是你在使用之前没有判空。所以导致 KERN-EXEC 3

void CDbOperator::Insert(const char* aSqlString)
……

谢谢胡兄的回复!下面是我调用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)//全量


//{
//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的时候没有内存泄露,在插入或更新的时候就有内存泄露。
[其他解释]
哦。这么多代码。。现在还有问题吗?
[其他解释]

引用:
哦。这么多代码。。现在还有问题吗?

还没有解决,修复了一下数据库,又有新问题:delete的时候出现disk I/O error错误。那个ptr好像是不可以删除的,我debug到那里,删除后就报USER 42问题。
[其他解释]
出现disk I/O error错误,是因为我打开后,sqlite3_exec( iDb, "PRAGMA synchronous = on", NULL, NULL, &ptr );应该为PRAGMA synchronous = off.

不过还是有以前的问题,插入到653条时出错,

[2011-06-22 04:20:56] 653
[2011-06-22 04:20:56] disk I/O error
[2011-06-22 04:20:56] 654
[2011-06-22 04:20:56] database disk image is malformed
[2011-06-22 04:20:56] 655
[2011-06-22 04:20:56] database disk image is malformed
[2011-06-22 04:20:56] 656
[2011-06-22 04:20:56] database disk image is malformed
...
[2011-06-22 04:20:56] 698
[2011-06-22 04:20:56] disk I/O error
[2011-06-22 04:20:56] 699
[2011-06-22 04:20:56] database disk image is malformed
[2011-06-22 04:20:56] 700
[2011-06-22 04:20:56] database disk image is malformed
...
[2011-06-22 04:20:56] 1008
[2011-06-22 04:20:56] out of memory
[2011-06-22 04:20:56] 1009
[2011-06-22 04:20:56] out of memory


[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。
[其他解释]

引用:
引用:

哦。这么多代码。。现在还有问题吗?

还没有解决,修复了一下数据库,又有新问题:delete的时候出现disk I/O error错误。那个ptr好像是不可以删除的,我debug到那里,删除后就报USER 42问题。

必须是可以删除得。人家接口是二级指针。。


[其他解释]
引用:
出现disk I/O error错误,是因为我打开后,sqlite3_exec( iDb, "PRAGMA synchronous = on", NULL, NULL, &amp;ptr );应该为PRAGMA synchronous = off.

不过还是有以前的问题,插入到653条时出错,

[2011-06-22 04:20:56] 653
[2011-06-22 04:20:……

不确定。但是我觉得几百条数据。应该没问题

热点排行