Qt QSqlDatabase的removeDatabase需要注意的地方

本文讲述了在重构代码时遇到的QSqlDatabase removeDatabase错误,通过理解Qt官方文档和实验,解决了资源泄漏问题。探讨了智能指针在避免资源管理问题上的作用,并分享了个人对C++基础和智能指针的理解与应用。
摘要由CSDN通过智能技术生成

问题描述

今天在做之前代码的重构的时候,在调用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),后面就找时间来搞清楚这个东东的应用场景吧…

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值