是.例如,考虑:
#include <iostream>
class B
{
public:
B() { std::cout << "B()\n"; }
~B() { std::cout << "~B()\n"; }
};
class D : public B
{
public:
D() { std::cout << "D()\n"; throw 23; }
~D() { std::cout << "~D()\n"; }
};
int main()
try
{
D d;
return 0;
}
catch(...) {}
Run Code Online (Sandbox Code Playgroud)
输出:
B()
D()
~B()
Run Code Online (Sandbox Code Playgroud)
http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.10
对象中的每个数据成员都应该清理自己的混乱.
如果构造函数抛出异常,则不会运行该对象的析构函数.如果您的对象已经完成了需要撤消的操作(例如分配一些内存,打开文件或锁定信号量),则必须通过对象内的数据成员记住这些"需要撤消的内容".
保证可以调用基本析构函数,但不能调用对象本身的析构函数.