Был просмотр источников Qt и sqlite ... интересно.
Читая руководство для sqlite3_open16()
, http://www.sqlite.org/c3ref/open.html,, можно найти следующую цитату:
Независимо от того, возникает ли ошибка при ее открытии, ресурсы, связанные с дескриптором подключения к базе данных, должны быть освобождены путем передачи ее в sqlite3_close (), когда она больше не требуется.
QSQLiteDriver::close()
, кажется, называет это, http://qt.gitorious.org/qt/qt/blobs/4.7/src/sql/drivers/sqlite/qsql_sqlite.cpp, только в случае успешного открытия. Документация SQLite может указывать, что sqlite3_close()
должен называться в любом случае.
С другой стороны, http://www.sqlite.org/c3ref/close.html утверждает, что он не работает, если для дескриптора передано NULL
(что было бы, если открытие не удалось). Взгляд на исходный код SQLite (сделай сам - я не знаю интерфейс браузера для него) подтверждает, что он просто возвращается, если вызывается с NULL
.
Ну что ж, теперь ради забавы ...
Наивно, предполагается, что сбой sqlite3_open*()
будет означать ручку NULL
дБ. Но, согласно источникам SQLite, прочитайте openDatabase()
в main.c
, это не так - вызов может завершиться неудачно, но все равно вернет вам дескриптор не-1030 * db.
Похоже, Qt предполагает, что сбой при открытии соединения с БД подразумевает получение дескриптора NULL
дБ. Но это не то, что делает SQLite. Документация может быть более понятной.
Попробуйте добавить это близко к QSQLiteDriver::open()
и посмотрите, исправит ли это утечку. Если это так, отправьте сообщение об ошибке ребятам из Qt, а другое - людям из SQLite, чтобы уточнить документацию; -)