21

假设我有以下代码:

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

int main()
{
    mytype instant;

    init_stuff();

    start();

    return 0;
}

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

4

3 回答 3

25

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

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

调用函数

void exit(int);

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

于 2010-04-19T14:20:12.587 回答
17

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

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

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

于 2010-04-19T14:20:18.397 回答
3

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

用一个

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

在您的main()函数中将保证捕获每个异常,并调用所有析构函数。

于 2010-04-19T14:24:14.503 回答