我在堆栈上分配了两个数据库类对象。我在我个人定义的类中继承了这个数据库类。现在数据库类有一个名为“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/