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

Tru*_*eon 20 c++ destructor exit

假设我有以下代码:

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

int main()
{
    mytype instant;

    init_stuff();

    start();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*lis 25

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

从C++标准(§3.6.1/ 4):

调用函数

void exit(int);
Run Code Online (Sandbox Code Playgroud)

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


小智 17

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

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

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