问题描述

今天在做之前代码的重构的时候,在调用QSqlDatabaseremoveDatabase函数的时候,出现了如下错误

QSqlDatabasePrivate::removeDatabase: connection '1638178058438' is still in use, all queries will cease to work

Qt官方解决方法

在Qt的官方文档中,有对removeDatabase这个函数的注释。

  意思就是说在移除掉数据库连接的时候,要确保没有正在打开的查询,否则会导致资源泄漏
  解决的方法是在remove之前释放掉QSqlQuery和QSqlDatabase这些个资源,最好的方式就是像上面一样让其工作在一个作用域,离开这个作用域就会自动释放了。

{
QSqlDatabase db = QSqlDatabase::database("sales");
QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);
}
// 这里db、query就超出作用域自动释放了。
QSqlDatabase::removeDatabase("sales");

另外一种解决方式

由于我的使用方法不一样,我是自己创建了一个类,这个类的有一个成员变量是QSqlDatabase对象,所以说我想在析构函数里进行removeDatabase就一直会报上面的错。

// DBdata.h
Class DBbase
{
public:
DBdata();
~DBdata(); private:
QSqlDababase db;
}; // DBdata.cpp
~DBdata()
{
db.close();
QString connectName = QSqlDatabase::connectName();
QSqlDatabase::removeDatabase(connectName);
// 在这里就会报is still use的问题。
}

在网上找到的解决方法是:

~DBdata()
{
db.close();
QString connectName = QSqlDatabase::connectName();
db = QSqlDatabase();
// 在这里对db进行一个重置,就可以了。
QSqlDatabase::removeDatabase(connectName);
}

然后我就在想,为啥会出现这样的错误呢?这里不是析构函数吗,成员函数不是到了生存期就会自己释放吗?
  后面找到了问题的所在点,我自己用两个类进行一个测试,发现析构函数是会在成员变量自己释放之前调用,按照上面的例子说就是,在db释放之前,就调用了removeDatabase,所以就会出现这种情况。
  但是我又想要在这个析构函数里进行removeDatabase,所以我就想到了另外一个方法:

// DBdata.h
Class DBbase
{
public:
DBdata();
~DBdata(); private:
QSqlDababase* db;
}; // DBdata.cpp
~DBdata()
{
db->close();
delete db;
QSqlDatabase::removeDatabase(connectName);
}

我把QSqlDatabase的对象变成一个指针,这样就可以在removeDatabase之前对db进行手动的释放了。
上述就已经把我遇到的这个问题给解决完成了,下面是我自己的一些碎碎念,就可以不往下翻了。

碎碎念

  最近好久没有写博客了,本意就是想对自己遇到的坑的解决方法和学到的知识记录一下,但是一直都找不到能够写的东西,所以就先没有写。之前在学校学的都是c的一些面向过程的思想(本人是电子专业,只学了c而且是选修…),所以很多写出的c++代码都还是四不像,根本没有用上c++的一些高级的东西,所以最近也是在有意识的去使用一些新的特性…这是不是一种奇怪的炫技…
  但是总的来说,像今天遇到的这个问题都是因为c++的基础不够好导致的,死记硬背实在是效果太低,所以说还是得多实践,多去自己主观的进行一些操作。
  突然反过头去看自己几个月之前写的代码,真是一言难尽,就是一堆屎山,刚好最近看了《重构:改善既有代码的设计》,就想法把自己的代码都去优化一下,当作提升自己的能力嘛,毕竟现在这个社会,真的是太卷了,同事们一个个卷的要死。

关于智能指针

最近看到的c++11中的一个特性就是智能指针(unique_ptrshared_ptr),觉得这个东西挺好的,但是就是不知道应用场景在哪里,网上搜到的很多都是为了用智能指针而用智能指针,其实根本就可以用一个在栈的对象,来实现RAII,所以就很困惑。在解决今天这个问题的时候,差点以为自己用上了这个新的特性,后面发现根本就没有必要用这个特性…瞬间就打脸了,Qt也有自己的智能指针(QScopePointerQSharedPointer),后面就找时间来搞清楚这个东东的应用场景吧…

Qt QSqlDatabase的removeDatabase需要注意的地方的更多相关文章

  1. QT里使用sqlite的问题,好多坑

    1. 我使用sqlite,开发机上好好的,测试机上却不行.后来发现是缺少驱动(Driver not loaded Driver not loaded),代码检查了又检查,发现应该是缺少dll文件(系统 ...

  2. QSqlDatabase::addDatabase第一次运行的时候,生成SQLite文件的同时会产生一个默认连接

    QSqlDatabase::addDatabase第一次运行的时候,生成SQLite文件的同时会产生一个默认连接: QSqlDatabase database = QSqlDatabase::addD ...

  3. Qt自定义事件的实现(转)

    原文:http://blog.csdn.net/michealtx/article/details/6866094 初学Qt,用了Qt自带的事件,然后想怎么才能定义自己的事件呢?又如何使用自定义事件呢 ...

  4. Qt Connect 信号 槽

    信号和槽机制是 QT 的核心机制 .信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性,也是 QT 区别于其它工具包的重要地方.信号和槽是 QT 自行定义的一种通信机制,它独立于标准 ...

  5. QT 的信号与槽

    转载: QT 的信号与槽机制介绍 QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 ...

  6. Qt中的键盘事件,以及焦点的设置(比较详细)

    Qt键盘事件属于Qt事件系统,所以事件系统中所有规则对按键事件都有效.下面关注点在按键特有的部分: focus 一个拥有焦点(focus)的QWidget才可以接受键盘事件.有输入焦点的窗口是活动窗口 ...

  7. qt信号signal和槽slot机制

    内容: 一.概述 二.信号 三.槽 四.信号与槽的关联 五.元对象工具 六.程序样例 七.应注意的问题 信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工 ...

  8. QT的信号与槽机制介绍

      信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工具以及在实际使用过程中应注意的一些问题. QT是一个跨平台的C++ GUI应用构架,它提供了丰富的窗 ...

  9. Qt自定义事件的实现(军队真正干活,但要增加监军,大平台通知事件,事件内容自定义)

    初学Qt,用了Qt自带的事件,然后想怎么才能定义自己的事件呢?又如何使用自定义事件呢?看了篇文章,说先要子类化QEvent,然后定义自己的QEvent::Type,然后重写QWidget::event ...

  10. Qt 的信号与槽机制介绍(10个要注意的问题)

    QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...

随机推荐

  1. 将现有的系统环境文件打包成Docker镜像文件

    一.现有A系统Centos7操作: 备注:A系统里最好不安装Docker,否则会报错 卸载不必要软件包 yum remove -y iwl* *firmware* --exclude=kernel-f ...

  2. Qt编写可视化大屏电子看板系统25-模块3设备监控

    一.前言 设备监控主要用来实时监测制造零件等使用的设备的工作运行状态,每个设备都有对应的需要.分组名称.分组编号.设备名称.文字1.文字2.工作状态(1-开机 2-待机 3-维护 4-空),不同的工作 ...

  3. [转]C#的二进制文件操作及关于Encoding类与汉字编码转换的问题

    1.数值应保存在二进制文件 首先列举文本.二进制文件的操作(读写)方法: 方式1: //文本文件操作:创建/读取/拷贝/删除 using System; using System.IO; class ...

  4. 有关主席树的一些 trick

    主席树做题记录. 主席树,即可持久化权值线段树. P3248 [HNOI2016] 树 难爆了这题.题目中会多次把模板树的某个子树放到大树上的某个节点下,我们把这一整个子树看作一个大节点,把模板树.大 ...

  5. 自定义快捷命令程序(VC++加批处理)

    一 概述 在看<从小工到专家-程序员修炼之道>时,看到建议使用Shell,很有感触.在很多时候,通过键盘操作,比鼠标的确会块很多,如果能用好shell命令(或批处理命令)   ,的确能节省 ...

  6. CV高手是怎么炼成的?

    你平时都怎么复制粘贴的?是否每次都是复制一段粘贴一段?是否厌倦了每次只能复制粘贴一次的限制?那这篇文章就是为你量身订做的. CopyQ简介 CopyQ is clipboard manager – a ...

  7. idea遇见Command line is too long. Shorten command line for Main or also for Application default configuration?

    <property name="dynamic.classpath" value="true" /> 第一步:找到项目目录下的.idea\works ...

  8. HTML标签-form表单

    HTML标签-form表单 在Web开发中,HTML表单(form)是不可或缺的一部分,它承担着用户与Web服务器之间交互的重任.今天,我们就来详细探讨一下HTML中的form表单标签. 一.form ...

  9. pg数据库性能优化(转)

    参数修改的方式 1.修改配置文件 在配置文件data目录下postgresql.conf 中直接修改,修改前记得备份一下原文件.修改完成之后,记得重启数据库哦. 2.命令行的修改方式 ALTER SY ...

  10. 在 PyTorch 中理解词向量,将单词转换为有用的向量表示

    你要是想构建一个大型语言模型,首先得掌握词向量的概念.幸运的是,这个概念很简单,也是本系列文章的一个完美起点. 那么,假设你有一堆单词,它可以只是一个简单的字符串数组. animals = [&quo ...