QSqlDriver :: close崩溃应用程序

时间:2014-01-04 20:57:05

标签: c++ qt qt5

我在使用QSqlDriver和QSqlDatabase时遇到了一些奇怪的问题。

在我的程序中,我打开了一个数据库连接。当主窗口被关闭并且所有对象都被销毁时,一个持有QSqlDatabase的对象试图在其上调用close()。它会导致崩溃。

我的调查显示:QSqlDatabase在驱动程序上调用close()。但是由于某些原因,在驱动程序的vtable(QSqlDriver)中指向正确的close()函数的指针指向无效的内存区域(未分配)。

Valgrind说的相同 - 未分配(并且最近没有释放内存)的用法。

我还发现,这个无效指针指向原始加载libqsqlmysql库的区域。但是,当应用程序关闭时,库正在卸载(对我来说太快了)。

我的问题:这种行为(卸载QSqlDatabase的sql插件)是以某种方式描述的吗?什么时候发生?我找不到任何规格。 其他问题是,如果这是正常行为或我做错了什么?

修改

我已填写此问题的错误报告:https://bugreports.qt.io/browse/QTBUG-35977

1 个答案:

答案 0 :(得分:2)

我的具体案例中的问题是我在类中持有数据库(QSqlDatabase)的连接。我不应该这样做,但是使用静态方法来获取单例。

在我的构造函数中:

Database::Database() {
   QSqlDatabase conn = QSqlDatabase::addDatabase("QSQLITE", dbName);
   conn.setDatabaseName(dbName);
   if (!conn.open())
   {
       qDebug() << conn.lastError().text();

       QMessageBox msgBox;
       msgBox.setIcon(QMessageBox::Critical);
       msgBox.setText(conn.lastError().text());
       msgBox.setStandardButtons(QMessageBox::Ok);
       msgBox.exec();
       QApplication::quit();
    }
}

然后,只要您需要访问连接

QSqlDatabase conn = QSqlDatabase::database(dbName);
QSqlQuery statement(conn);

这停止了我退出时的崩溃

Source