我的朋友遇到了一些问题。假设,我们有一个实现数据库连接的类,如下所示:
class DB
{
void Connect();
void Disconnect();
// ...
~DB();
};
在我看来,析构函数应该是minimalistic的,这意味着析构函数不应该在建立连接时调用Disconnect方法。我认为,这应该通过单独的方法完成(本例中为disconnect())。我是正确的,还是我的朋友?
PS。社区维基?
答案 0 :(得分:8)
你的析构函数应该足以清理在对象生命周期中获得的所有资源。这可能包括也可能不包括结束连接。否则,如果抛出异常,谁将进行清理?
答案 1 :(得分:2)
根据语法,它看起来像C ++。我对么?因为如果是这样,你可以(并且强烈建议)使用RAII习语。这意味着您在构造时获取数据库连接,在销毁时释放它(断开连接)。
答案 2 :(得分:2)
RAII成语说:在构造函数中获取并在解构器中释放。你必须保证你的解构者不会抛出任何东西。否则,如果对象解构器在堆栈展开期间抛出异常,则会有核心转储(或未定义的行为)。
同样在你的特定情况下,我可能会实现一个引用计数机制,并在你没有任何对象使用连接时调用断开连接。
答案 3 :(得分:0)
从类用户的角度来看,我认为最好尝试和disconnect
数据库连接,而不是假设析构函数会完成这项工作。
然而,糟糕的事情发生了,最明显的例外,你必须保证无论发生什么事情都会发生清理。这就是为什么你的析构函数在必要时应该disconnect
的原因(即:如果它没有被用户明确调用)。