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

转载于:https://www.cnblogs.com/codingmylife/archive/2010/04/27/1722404.html

Qt中使用QSqlDatabase::removeDatabase()的正确方法相关推荐

  1. 【转】QT中使用MYSQL中文乱码解决方法

    [转]QT中使用MYSQL中文乱码解决方法 Linux下乱码解决办法: 1.在QT程序的main.cpp的main函数中添加红色字那三句: int main(int argc, char *argv[ ...

  2. QT中三种构建菜单栏的方法

    QT中三种构建菜单栏的方法 方法1 <C++ GUI programming with Qt 4, Second Edition>给出的一种方法:QMenum定义单个菜单,调用menuBa ...

  3. Mybatis中使用大于小于等于的正确方法

    在mybatis中sql是写在xml映射文件中的,如果sql中有一些特殊字符的话,在解析xml文件的时候就会被转义,如若不希望被转义,那该怎么办呢? 方法一:使用特殊转义字符 例如,>=开始日期 ...

  4. css如何载入多种字体,在css中包含多种字体的正确方法

    我不是一个简单的时刻.哪种方式是在css中包含多种字体的正确方法?这里是简单的例子.在css中包含多种字体的正确方法 This? @font-face { font-family: Delicious ...

  5. 在Qt中设置鼠标光标形状的方法介绍

    本文主要介绍在 Qt 中设置鼠标光标形状的方法. 说明: 本文中的应用程序是面向 Windows 操作系统的: 本文中使用的 Qt Creator 版本号为:7.0.0: 本文中使用的 Qt 版本号为 ...

  6. Qt 中获取摄像头图像数据的方法

    Qt 中获取摄像头图像数据的方法 在 Qt 中提供了 QCamera 类用来操作摄像头.(这里的摄像头指的是电脑上常用的那种 USB 摄像头或网络摄像头,暂时还不支持工业相机.)摄像头获取的实时图像可 ...

  7. qt中调用sdk包流程、方法、注意事项详细说明

    qt是以c++为基础语言的编程工具,如果想调用其他语言已经写好的接口,比如java.或者是用java语言导出的jar包,要用到jni技术. JNI是Java Native Interface的缩写,它 ...

  8. Qt中定时器使用的两种方法

    Qt中定时器的使用有两种方法,一种是使用QObject类提供的定时器,还有一种就是使用QTimer类. 其精确度一般依赖于操作系统和硬件,但一般支持20ms.下面将分别介绍两种方法来使用定时器. 方法 ...

  9. Qt中实现Sleep功能的简单方法

    最近在QT的学习中,需要用到延时,但是在QT中没有直接的Sleep函数 ,添加 < stdlib >头文件也不能识别Sleep,查阅资料后才了解到,原来QT中没有直接的延时函数,看了很多方 ...

最新文章

  1. 生活只是需要一种积极的态度
  2. EJB之JPA(UUID与TABLE影射策略)
  3. JBoss BRMS与JasperReports进行报告
  4. mysql日期条件如何应用_MySQL如何使用时间作为判断条件
  5. GARFIELD@04-02-2005
  6. 计算机软件应用员,济宁计算机办公应用软件操作员
  7. vba 指定列后插入列_在不同的列左侧插入指定数量的空白列
  8. WinForm DataGridView 绑定泛型List(ListT)/ArrayList不显示的原因和解决
  9. windows linux cpu 抢占式 时间片_阿里技术专家谈:CPU飙高,系统性能问题如何排查?...
  10. ORA-29538、ORA-29532、ORA-29913问题解决
  11. FFT变换频谱图中频率刻度的设置方法
  12. 分治法求两个等长升序序列的联合中位数
  13. 云计算作业001-电脑配置
  14. NeatUpload
  15. 985翻译硕士都在找的这款软件
  16. xdb 服务_oracle XDB的问题,端口、http服务
  17. 网卡的功能主要有两个
  18. 【网络设备】H3C FW V7:安全域与域间策略
  19. ipv6如何测试服务器已经是ipv6协议,怎么测试域名是否支持ipv6
  20. 记一次HBuilder X 封装H5 + 微信登录

热门文章

  1. 透明的WinForm窗体
  2. 安装mariadb、安装Apache
  3. monkey测试===通过monkey测试检查app内存泄漏和cpu占用
  4. Qt QTcpSocket使用总结
  5. 用尽洪荒之力整理的Mysql数据库32条军规
  6. 【思科】GNS3模拟静态NAT/动态NAT
  7. 微软公布 Windows Phone 8 多项新特性
  8. JS获取当前对象大小以及屏幕分辨率等
  9. 大数定理 中心极限定理_中心极限定理:直观的遍历
  10. 虚拟dom添加虚拟dom_虚拟DOM缓慢。 认识记忆化的DOM