欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

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

更新时间: 2014-01-05 02:40:57 责任编辑: Author_N1

 

使用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)//全量
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 02:40:57
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/13121/
本文WWW.DOC100.NET DOC100.NET版权所有。