QSqlQuery内存问题.QSqlQuery::exec()和QSqlDatabase::open()/close()
QSqlQuery Memory issues. QSqlQuery::exec() and QSqlDatabase::open()/close();
我正在检查我所做的应用程序的内存使用情况。它会调用大量的调用来向数据库(SQLite 3)读写值。
-
QSqlQuery::exec()使用一些KB的内存来执行给定的查询,但是在超出范围后不释放内存。
-
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();
经过实验,我发现下面的代码"陷阱"更少的内存:
QStringList values;
QString strQuery = "SELECT DISTINCT " + field + " FROM " + table + str;
QSqlQuery query(strQuery, db);
while(query.next())
{
values.push_back(query.value(0).toString());
}
但是,仍有少量内存未释放。其他人有过类似的经历吗?
我能怎样释放这些内存吗?
注。这里也一样,一些内存永远不会被释放:
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();
似乎为了释放这个内存,你必须创建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();
您必须使用QSqlQuery。finish()或QSqlQuery。在关闭数据库之前清除。否则将在Query对象中遗漏剩余内存。文档中提到Query对象可以用于多个查询。你会注意到"内存泄漏"…当查询10000条记录时。内存使用率急剧上升
从QSqlDatabase::addDatabase和QSqlDatabase::database()的文档中可以推断出存在一个管理数据库连接的全局变量。如果你查看qsqldatabase.cpp,你会发现一个QConnectionDict。
BTW:不要通过连接字符串来构造SQL查询,如果查询的部分有可能来自用户输入,请始终使用prepare和bindValue (SQL注入!)。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- Poco::Net::FTPClientSession 在 open() 方法上挂起 129 秒,如果 ftp 主机不存
- Node.js fs.open() 在尝试打开 4 个以上的命名管道 (FIFO) 后挂起
- POSIX open() 挂在 SMB 共享上
- C++:std::ofstream 方法 open() 在第二次迭代时擦除打开的 ifstream 文件
- Qt/SQL - 从 QSqlQuery exec Stored Procedure 获取列类型和名称?
- Visual Studio "fatal error LNK1104: cannot open file"未使用或包含的库
- Qt 错误:QSqlQuery::value:尝试从表中检索统计信息时未定位在有效记录上 (QComboBox)
- C++ 错误检查 fstream open() 命令和一般字符串流错误处理
- VS 2017 C++ - "cannot open source file 'sqlite3.h' "
- 在VS 15.7.5中,悬停在Open CV 3.4.1Mat上仍然冻结
- 计算着色器Open GL ES的多个输入
- 从生成文件编译错误:"Unable to open output file" ..."No such file or directory"
- Open GL ES 3.1 的计算着色器的最小工作示例
- 我可以对"int 文件 = open(path, flag);"做点什么吗?
- 进口。TLB文件给出"cannot open source file x.tlh"
- 问题 (std::bad_alloc) 通过 QThread 中的 QSqlQuery 将大图像(约 36 MB)保存到
- QtCreator 中的"Fatal Error C1083: Cannot open include file"
- QSqlQuery 不从 postgresql 中选择记录
- QSqlQuery内存问题.QSqlQuery::exec()和QSqlDatabase::open()/close()