首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QSqlQuery内存问题。QSqlQuery::exec()和QSqlDatabase::open()/close();

QSqlQuery内存问题。QSqlQuery::exec()和QSqlDatabase::open()/close();
EN

Stack Overflow用户
提问于 2011-07-14 08:18:22
回答 3查看 6.9K关注 0票数 5

我正在检查我开发的应用程序的内存使用情况。它进行多次调用,以从数据库(SQLite 3)读取和写入值。我观察到以下情况:

  • QSqlQuery::exec()使用一些KB的RAM来执行给定的查询,但是当内存从scope.
  • QSqlDatabase::打开()和close()之后不释放,就不会像文档所建议的那样帮助释放资源。如果有的话,close()会导致资源(至少是内存)在堆/堆栈上保持“被困”。

例如,下面是我用来访问数据库的典型代码段。

代码语言:javascript
复制
QStringList values;
db.open();
QString strQuery = "SELECT DISTINCT " + field + " FROM " + table + str;

QSqlQuery query(db);
query.prepare(strQuery);

if(query.exec() == true)
{
  while(query.next())
  {
    values.push_back(query.value(0).toString());
  }
}

db.close();

通过实验,我发现下面的代码“陷阱”内存较少:

代码语言:javascript
复制
QStringList values;
QString strQuery = "SELECT DISTINCT " + field + " FROM " + table + str;

QSqlQuery query(strQuery, db);

  while(query.next())
  {
    values.push_back(query.value(0).toString());
  }

然而,仍有少量内存未被释放。还有其他人经历过这样的事情吗?

我能不能怎么释放这个记忆?

附注:同样的情况发生在这里,一些内存从未被释放:

代码语言:javascript
复制
db.open();
QSqlQuery query(db);

query.exec("DELETE FROM table1");
query.exec("DELETE FROM table2");
query.exec("DELETE FROM table3");
query.exec("DELETE FROM table4");
...

db.close();
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-18 11:09:55

似乎为了释放这个内存,必须将QSqlQuery变量作为指针创建,并在关闭数据库之前删除该指针:

代码语言:javascript
复制
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();

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

票数 3
EN

Stack Overflow用户

发布于 2011-07-14 09:40:19

从QSqlDatabase::addDatabase和QSqlDatabase:: database ()的文档中可以推断,有一个全局变量管理数据库连接。如果您查看qsqldatabase.cpp,您将发现一个QConnectionDict。

注意:不要通过串连字符串来构造SQL查询,如果查询的部分可能来自用户输入,请始终使用准备和bindValue (SQL!)。

票数 1
EN

Stack Overflow用户

发布于 2011-09-05 15:16:39

在关闭数据库之前,必须使用QSqlQuery.finish ()或QSqlQuery.clear。否则,查询对象中将遗漏剩余内存。文档中提到,查询对象可用于多个查询。你会注意到“内存泄漏”。查询10,000条记录时。内存使用量急剧增加。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6690341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档