c++ - 虚拟析构函数中的异常处理

标签 c++

我在堆栈上分配了两个数据库类对象。我在我个人定义的类中继承了这个数据库类。现在数据库类有一个名为“Close()”的函数,如果关闭该数据库实例失败,它会抛出异常。现在从客户端的角度来看,我不希望客户端每次都调用 close() 来关闭连接,而是我想在数据库类中声明一个 vitrual Descuctor,它会在对象超出范围时自动关闭连接。 现在我面临的问题是,如果我创建了两个 DB 对象,现在尝试删除这两个对象,如果两者都关闭成功,那很好,但是如果第一个对象关闭失败,它会抛出异常,现在第二个对象仍然被分配(如果动态分配的成员对象),这会导致内存泄漏。如何处理这种情况。

最佳答案

你永远不会从析构函数中抛出异常! 请参阅:http://www.stroustrup.com/bs_faq2.html#ctor-exceptions
Bjarne 引用(你能从 d.tor 中抛出异常吗):

Not really: You can throw an exception in a destructor, but that exception must not leave the destructor; if a destructor exits by a throw, all kinds of bad things are likely to happen because the basic rules of the standard library and the language itself will be violated. Don't do it.

您可能不想在堆栈上分配任何 DB 对象,一个安全、可重用的方法是使用连接池: https://en.wikipedia.org/wiki/Object_pool_pattern

像这样,每个conenction对象的销毁是在程序存在时,你可以将关闭作为池的组成部分来处理,而不是在一些随机函数中以散布的方式处理

关于c++ - 虚拟析构函数中的异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31454518/

相关文章:

C++无符号无限循环比较错误

c++ - 从 vector C++ 中的元素中减去值

c++ - cpp : explanation about undefined reference to `(anonymous namespace)::CPassant::NbCPassant'

c++ - 通过两个不同的可执行文件进行 IPC?

时间:2019-03-08 标签:c++fstreamconcurrentaccess

c++ - 并非所有工作项目都在使用 opencl

c++ - 使用 std::async 控制并行度

C++,合适的数据模型,多态性

c++ - 当 header 中指定文本/纯文本时,eBay API 返回 JSON

c++ - 如何解决 Cppcheck 中的问题 ID "toomanyconfigs"和 "missingInclude:"