QSqlQuery内存问题分析及解决

QSqlQuery内存问题分析及解决(QT技巧系列18)

 

QSqlQuery :: exec()使用一些KBRAM来执行给定的查询,但在超出作用域后不释放内存。

QSqlDatabase :: open()& close()不会像文档提示那样帮助释放资源。如果有的话,close()会导致资源(至少是内存)在堆/栈上保持“被困”。

解决方法:

1、创建QSqlQuery变量作为指针

要释放这个内存,创建QSqlQuery变量作为指针,并在关闭数据库之前删除此指针:

QStringList values;

db.open();

QString strQuery = "SELECT DISTINCT " + field + " FROM " + table + str;

QSqlQuery *query = new QSqlQuery(db);

query->prepare(strQuery);

if(query->exec() == true)

{

  while(query->next())

  {

    values.push_back(query->value(0).toString());

  }

}

delete query;

db.close();

然后在数据库关闭后释放内存。

2在关闭数据库之前,必须使用QSqlQuery.finish()QSqlQuery.clear

在关闭数据库之前,必须使用QSqlQuery.finish()QSqlQuery.clear。否则,Query对象中会遗漏剩余内存。文档中提到Query对象可用于多个查询。当您查询10,000条记录时,您会注意到内存泄漏。内存使用率急剧上升。

 

    query.clear();

    query.finish();

    db.close();

 

3线程中使用的QSqlQuery需要提升为类成员

H头文件中定义:

        QSqlQuery  queryWarning;

CPP文件中按如下始化化:

        queryWarningQSqlQuery(Qrydb); 

执行完毕后

    queryWarning.clear();

    queryWarning.finish();

    db.close();

 

这样可避免程序多线程向数据库插入数据时偶尔产生崩溃的问题。

 


备注:实战示例,解疑答惑。

           --不间端地思考,实时地批判你的工作!

  • 7
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值