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

nf3*_*743 5 c++ sqlite qt

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

  • QSqlQuery::exec() 使用一些 KB 的 RAM 来执行给定的查询,但在超出范围后不会释放内存。

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

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

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();
Run Code Online (Sandbox Code Playgroud)

经过试验,我发现下面的代码“陷阱”了更少的内存:

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

QSqlQuery query(strQuery, db);

  while(query.next())
  {
    values.push_back(query.value(0).toString());
  }
Run Code Online (Sandbox Code Playgroud)

但是,仍然没有释放少量内存。有没有其他人经历过这样的事情?

我可以一些如何释放这个记忆?

Ps 同样发生在这里,一些内存永远不会被释放:

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();
Run Code Online (Sandbox Code Playgroud)

nf3*_*743 3

看来,为了释放此内存,您必须创建 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();
Run Code Online (Sandbox Code Playgroud)

数据库关闭后,内存将被释放。