Qt中使用QSqlDatabase::removeDatabase()的正確方法 good


 

如果你用過Qt的QSqlDatabase的話,多半會對下面的警告信息感興趣:

QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all

queries will cease to work.

意思是說,還有某查詢引用默認數據庫連接"qt_sql_default_connection"。

如果忽略該警告,Qt官方文檔里也寫了,可能會出現內存泄漏:

Warning: There should be no open queries on the database connection when this function is called,

otherwise a resource leak will occur.

還是不出現這個警告的好。怎么把它弄沒了呢?我把一切外圍的對象都排除了:僅建立一個連接,打開它,然后關閉連接,調用removeDatabase()。居然還有警告!問題已經鎖定在我關閉連接的語句上:

QSqlDatabase::removeDatabase(QSqlDatabase::database().connectionName());

默認連接的名字也是默認的,需要通過connectionName()函數獲得。這樣寫貌似沒什么問題,后來調試發現,QSqlDatabase::database()靜態函數實際上使默認連接的引用計數+1。上述句子相當於:

QSqlDatabase db = QSqlDatabase::database();//獲得實例。
QString name = db.connectionName();//獲得默認連接名。
QSqlDatabase::removeDatabase(name);//刪除默認連接。

這樣,問題就清晰了,db獲得了一個引用,此時引用計數為2。在調用removeDatabase()時,db對象並沒有被刪除,默認連接的引用計數仍為2,於是報告警告信息。

我們只需將其改為:

 

    QString name;
    {
        name = QSqlDatabase::database().connectionName();
    }//超出作用域,隱含對象QSqlDatabase::database()被刪除。
    QSqlDatabase::removeDatabase(name);

問題就解決了!

如果直接打默認連接名的話,代碼就簡單多了,不過名字不太好打(再說了,萬一Qt把默認連接名改了呢!):

QSqlDatabase::removeDatabase("qt_sql_default_connection");//不推薦。

 

================下面是官方文檔摘錄================

 

Warning: There should be no open queries on the database connection when this function is called, otherwise a resource leak will occur.

Example:

 // WRONG
 QSqlDatabase db = QSqlDatabase::database("sales");
 QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);
 QSqlDatabase::removeDatabase("sales"); // will output a warning
 
        
 // "db" is now a dangling invalid database connection,
 // "query" contains an invalid result set

The correct way to do it:

 {
     QSqlDatabase db = QSqlDatabase::database("sales");
     QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);
 }
 // Both "db" and "query" are destroyed because they are out of scope
 QSqlDatabase::removeDatabase("sales"); // correct
 
http://www.cnblogs.com/codingmylife/archive/2010/04/27/1722404.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM