如果你用过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

最新文章

  1. C#的接口
  2. IPD模式下开展敏捷开发的一些问题汇总
  3. C#语法糖之 session操作类 asp.net
  4. Messages消息处理
  5. homework-08-作业2
  6. python中列表,元组,字符串如何互相转换
  7. putty 实现不用输入用户名密码直接登陆
  8. 用C语言打印出三角函数
  9. hdu 3572 Task Schedule (dinic算法)
  10. hibernate 使用sql 查询(setResultTransformer)
  11. Linux Centos 6.5_x86安装Nginx
  12. MyBatis中批量插入数据对插入记录数的限制
  13. day12-(jsp&el&jstl)
  14. PHP(表单元素)
  15. django 路由系统中name应用
  16. Red5视频流服务器安装
  17. ES6中Object.assign() 方法
  18. sklearn调参(验证曲线,可视化不同参数下交叉验证得分)
  19. OEMCC 13.2 安装部署
  20. 正则匹配-URL-域名

热门文章

  1. Yii2.0
  2. 2013级别C++文章9周(春天的)工程——运算符重载(两)
  3. C# WPF 歌词控件(支持逐字定位描色效果)
  4. WPF 3D动态加载模型文件
  5. Json格式日期转换为一般日期
  6. asp .net 页面跳转
  7. 【剑指Offer学习】【面试题4 : 替换空格】
  8. Halcon程序导出运行的方法
  9. 【Repo】推送一个已有的代码到新的 gerrit 服务器
  10. linux安装脚本