当前位置: 代码迷 >> Symbian >> 使用sqlite内存不足的有关问题
  详细解决方案

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

热度:8494   发布时间:2013-02-26 00:00:00.0
使用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)//全量
  相关解决方案