我在QSqlDriver和QSqlDatabase方面遇到了一个奇怪的问题。
在我的程序中,我打开了一个数据库连接。当主窗口被关闭并且所有对象都被销毁时,一个包含QSqlDatabase的对象试图对其调用close()。这会导致崩溃。
我的调查显示:QSqlDatabase在驱动程序上调用close()。然而,由于某些原因,指向驱动程序的vtable(QSqlDriver)中适当的close()函数的指针指向无效的内存区域(未分配)。
Valgrind也这么说——使用未分配的内存(以及最近未释放的内存)。
我还发现,这个无效指针指向最初加载libqsqlmysql库的区域。然而,当应用程序关闭时,库将被卸载(对我来说太快了)。
我的问题是:这种行为(卸载QSqlDatabase的sql插件)是以某种方式描述的吗?它究竟是什么时候发生的?我找不到任何规格。另一个问题是,这是正常行为还是我做错了什么?
编辑
我已经为此问题填写了错误报告:https://bugreports.qt.io/browse/QTBUG-35977
在我的特定案例中,问题是我在一个类中持有到数据库(QSqlDatabase)的连接。我本不应该这么做,但使用了静态方法来获得singleton。
在我的构造函数中:
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);
这为我阻止了出口时的崩溃
源