Почему следующий код выводит true, а не false?
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
if (!openDatabase()) return 1;
// false means don't open closed connections.
QSqlDatabase db2 = QSqlDatabase::database("foo", false);
qDebug() << db2.isOpen();
return 0;
}
bool openDatabase()
{
QSqlDatabase db1 = QSqlDatabase::addDatabase("QPSQL", "foo");
db1.setHostName("localhost");
db1.setUserName("user");
db1.setPassword("password");
db1.setDatabaseName("bar");
return db1.open();
}
Согласно примеру № 2 в первом ответе на Каков правильный способ QSqlDatabase & QSqlQuery? соединение с базой данных закрывается, когда объект QSqlDatabase
выходит за пределы области действия. Таким образом, когда db1
выходит за рамки в конце openDatabase()
, соединение должно быть закрыто.
(Что на самом деле происходит, немного более тонко. Внутри QSqlDatabase
поддерживает счетчик ссылок QSqlDatabase
объектов, которые он вернул для определенного соединения. Счетчик ссылок уменьшается на ~QSqlDatabase
, и когда он достигает 0, соединение закрывается. Однако, это ничего не должно изменить.Счетчик ссылок должен быть равен 1 после первой строки в openDatabase()
и 0 после завершения функции и уничтожения db1.)
Что мне не хватает?
openDatabase()
будет иметь глобальную область действия.. поэтому ваш код соответствует примеру № 1 в ссылке. - person Mohammad Kanan   schedule 27.01.2018openDatabase()
имеет глобальную область действия,db1
является локальным дляopenDatabase()
, и его деструктор вызывается при возврате функции. В примере № 1db
имеет то же время жизни, что и ваше приложение (например, выделено вmain()
), или является глобальной переменной. Его деструктор не вызывается до завершения работы приложения. - person Ronald Bourret   schedule 28.01.2018