exit()或异常会阻止调用范围的析构函数吗?

时间:2010-04-19 14:17:10

标签: c++ destructor exit

假设我有以下代码:

struct mytype
{
    ~mytype() { /* do something like call Mix_CloseAudio etc */ }
};

int main()
{
    mytype instant;

    init_stuff();

    start();

    return 0;
}

即使从start()内部的某个地方使用了exit(),这个析构函数是否可以保证被调用?

3 个答案:

答案 0 :(得分:23)

如果您致电exit,则不会调用析构函数。

来自C ++标准(§3.6.1/ 4):

  

调用函数

void exit(int);
  在<cstdlib>(18.3)中声明的

终止程序而不离开当前块,因此不会破坏任何具有自动存储持续时间的对象(12.4)。如果在销毁具有静态存储持续时间的对象期间调用exit来结束程序,则程序具有未定义的行为。

答案 1 :(得分:17)

是的,调用exit()意味着不会调用析构函数:

  

调用函数void exit(int);   在<cstdlib>中声明(18.3)   终止程序而不离开   当前的块,因此没有   用自动破坏任何物体   储存时间(12.4)。如果退出   呼吁结束一个节目期间   用静态破坏对象   存储持续时间,程序有   未定义的行为。

如果抛出异常,另一方面,将调用析构函数。这是C ++中异常安全的基础。

答案 2 :(得分:3)

只要程序中的某些内容捕获异常,异常就会调用析构函数。如果异常退出main()函数而没有被捕获,则标准不要求运行时将堆栈展开以进行清理。

使用

try{
  // code
}catch(...){ //that elipsis should actually appear in your code
             //it doesn't mean I omitted code here.
  //code
}
main()函数中的

将保证捕获每个异常,并调用所有析构函数。