我正在检查我制作的应用程序的内存使用情况。它多次调用从数据库(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)
看来,为了释放此内存,您必须创建 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)
数据库关闭后,内存将被释放。
归档时间: |
|
查看次数: |
6557 次 |
最近记录: |