当抛出异常并且控制从 try 块传递到处理程序时,C++ 运行时调用自 try 块开始以来构造的所有自动对象的析构函数。这个过程称为堆栈展开。自动对象按照其构造的相反顺序被销毁。(自动对象是已声明为 auto 或 register,或未声明为 static 或 extern 的局部对象。只要程序退出声明 x 的块,就会删除自动对象 x。)
如果在构造由子对象或数组元素组成的对象期间引发异常,则仅对在引发异常之前成功构造的那些子对象或数组元素调用析构函数。仅当成功构造对象时才会调用本地静态对象的析构函数。
如果在堆栈展开期间析构函数抛出异常并且该异常未被处理,则调用 terminate() 函数。
示例:请参见下面的反汇编。你会看到析构函数已经被压入堆栈。
class Test
{
public:
Test()
{
std::cout<<"C'tor\n";
}
~Test()
{
std::cout<<"D'tor\n";
}
}
int main()//_TCHAR* argv[])
{
Test();
}
00DD9C30 55 push ebp
00DD9C31 8B EC mov ebp,esp
00DD9C33 81 EC CC 00 00 00 sub esp,0CCh
00DD9C39 53 push ebx
00DD9C3A 56 push esi
00DD9C3B 57 push edi
00DD9C3C 8D BD 34 FF FF FF lea edi,[ebp-0CCh]
00DD9C42 B9 33 00 00 00 mov ecx,33h
00DD9C47 B8 CC CC CC CC mov eax,0CCCCCCCCh
00DD9C4C F3 AB rep stos dword ptr es:[edi]
23:
24: Test();
00DD9C4E 8D 8D 3B FF FF FF lea ecx,[ebp-0C5h]
00DD9C54 E8 67 7C FF FF call Test::Test (0DD18C0h)
00DD9C59 8D 8D 3B FF FF FF lea ecx,[ebp-0C5h]
00DD9C5F E8 03 76 FF FF call Test::~Test (0DD1267h)
25: }