【发布时间】:2011-05-29 08:32:06
【问题描述】:
刚好发生在我身上,我想知道在以下情况下如何释放资源。
class Base {
Resource *r;
public:
Base() { /* ... */ }
~Base() {
delete r;
}
};
class Derived : public Base {
public:
Derived() { /* ... */ }
~Derived() {
/* Suddenly something here throws! */
}
};
int main() {
try {
Derived d;
} catch(...) {
/* what happened with Base::r !? */
}
}
如果派生类析构函数抛出,会调用基类析构函数吗?还是会漏水?
【问题讨论】:
-
根据记忆,如果析构函数抛出,标准的定义非常复杂且通常很糟糕,以至于没有人从析构函数中抛出异常。我也很确定所有标准容器都假定析构函数是 nothrow。基本上,虽然我认为从技术上讲,它是合法且明确的,但现实情况是没有人这样做,而且有充分的理由,所以永远不要这样做。
-
您那里的样本应该没有问题。 d 只是以正常的方式超出范围。如果 d 被破坏的原因是堆栈作为处理另一个异常的一部分正在展开,事情可能会变得令人讨厌。正是这种可能性导致了永远不要抛出析构函数的经验法则。
标签: c++ exception destructor memory-leaks