我在使用QSqlDriver和QSqlDatabase时遇到了一些奇怪的问题。
在我的程序中,我打开了一个数据库连接。当主窗口被关闭并且所有对象都被销毁时,一个持有QSqlDatabase的对象试图在其上调用close()。它会导致崩溃。
我的调查显示:QSqlDatabase在驱动程序上调用close()。但是由于某些原因,在驱动程序的vtable(QSqlDriver)中指向正确的close()函数的指针指向无效的内存区域(未分配)。
Valgrind说的相同 - 未分配(并且最近没有释放内存)的用法。
我还发现,这个无效指针指向原始加载libqsqlmysql库的区域。但是,当应用程序关闭时,库正在卸载(对我来说太快了)。
我的问题:这种行为(卸载QSqlDatabase的sql插件)是以某种方式描述的吗?什么时候发生?我找不到任何规格。 其他问题是,如果这是正常行为或我做错了什么?
修改
我已填写此问题的错误报告:https://bugreports.qt.io/browse/QTBUG-35977
答案 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);
这停止了我退出时的崩溃