我在看Qt示例“表模型示例”
在该示例中,connection.h中的createConnection()方法包含以下代码:
static bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
if (!db.open()) {...我在代码中复制了这个示例。我不明白两件事。
我是Qt新手,但在C++方面非常有经验。这段代码对我来说没什么意义。我希望db变量的生存期是开放数据库的生存期。正如示例中所编码的那样,我无法理解这段代码如何没有出现资源泄漏。据我所知,初始化db会打开某种全局资源,即使db变量被破坏导致泄漏,也会使它保持打开状态。
这很让人困惑。
谢谢。
H Os Tile
发布于 2016-06-21 05:49:59
这只是一个很小的例子。
QSqlDatabase::addDatabase("QSQLITE");将创建默认连接,该连接将被任何后续查询使用,而不是显式命名另一个连接。在作用域结束时,连接不会被销毁。在本例中,createConnection()将用于初始化inMemory数据库。稍后可以使用QSqlDatabase::database()检索连接。在标准应用程序中,可能会将QSqlDatabase db保留为类成员。QFile::exists(QString path)。如果要打开许多数据库( QSqlDatabase::addDatabase("QSQLITE","anotherConnectionName");上有不同的连接名称,则会有泄漏)。否则,您只需要覆盖默认的数据库连接。QApplication本身将保留这些连接。它们可以使用QSqlDatabase::removeDatabase()显式删除;
发布于 2016-06-21 22:06:08
QSqlDatabase是一个相当奇怪的类。阅读它的文件。连接保持不变,QSqlDatabase是它的句柄。连接被命名,addDatabase用给定的名称返回连接,如果它不存在,还可以选择创建它。可以有任意数量的QSqlDatabase对象表示一个连接。
由于内存中的sqlite数据库是特定于您的进程的,所以当您要求创建一个数据库时,不创建它是没有什么意义的。要想提前创建它,唯一的方法是直接从您的过程中使用sqlite。这些数据库不会持久存在。这里的行为是相当明智的。
https://stackoverflow.com/questions/37933155
复制相似问题