【发布时间】:2016-06-20 23:03:53
【问题描述】:
我在看Qt示例“表模型示例”
在该示例中,connection.h 中的 createConnection() 方法包含以下代码:
static bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
if (!db.open()) {...
我在我的代码中复制了这个示例。我不明白关于它的两件事。
局部变量 db 在 createConnection() 函数结束时被销毁(参见 RAII)。由于我的数据库不需要初始化并且我没有使用“db”变量,我不明白为什么我需要这段代码。但是,如果我删除它,我的程序将无法从现有数据库中读取。我希望数据库的破坏会关闭数据库并使其不可用。但是,由于我不接触 db 变量,为什么需要先创建然后销毁它才能访问数据库?由于我没有在任何地方使用 db 变量,并且在调用我的代码之前它就被销毁了,所以我根本不明白为什么我需要调用 createConnection() 函数。另一方面,我看不到如何打开数据库并导致变量销毁具有异常安全的 RAII 代码。
我从来没有让 db.open() 失败。如果我没有数据库,它会创建它然后打开一个空白的。如果我确实有数据库,它会打开它。我有一个数据库,如果由于某种原因无法打开,我不想创建它,我想要一个错误,因为出现了严重错误。打开一个空白数据库对我来说只会是个麻烦。我该如何处理这种情况?
我是 Qt 新手,但在 C++ 方面非常有经验。这段代码对我来说意义不大。我希望 db 变量的生命周期是开放数据库的生命周期。如示例中的编码,我看不到此代码如何没有资源泄漏。据我所知,初始化 db 会打开某种全局资源,即使在 db 变量被破坏导致泄漏后也保持打开状态。
这很令人困惑。
谢谢。
H Os 平铺
【问题讨论】:
-
QSqlDatabase是一个相当奇怪的类。阅读它的文档:它并没有按照您的想法行事。这不是 RAII 类。