发布于 

C++杂谈001. exit()时的对象析构

当调用exit()函数终止进程时,会触发C++静态和全局对象的析构,但局部对象不会被析构。

一个简单的demo程序如下:

class Foo {
public:
Foo(const std::string &desc) : desc_(desc) {
cout << "call Foo ctor of " << desc_ << endl;
}
~Foo() {
cout << "call Foo dtor of " << desc_ << endl;
}
private:
std::string desc_;
};

class Bar {
private:
static Foo foo_;
};

Foo Bar::foo_("static in class");

static Foo foo01("static");
Foo foo02("global");

int main() {
Foo foo03("local");
static Foo foo04("local static");
cout << endl;
exit(0);
}

执行结果如下:

call Foo ctor of static in class
call Foo ctor of static
call Foo ctor of global
call Foo ctor of local
call Foo ctor of local static

call Foo dtor of local static
call Foo dtor of global
call Foo dtor of static
call Foo dtor of static in class

可以看到:
1、无论是全局对象,还是各种静态对象(文件内静态对象、类的静态对象、函数内静态对象)都执行了析构,而main()函数中局部对象没有析构。
2、全局/静态对象(不在函数中)构造的顺序是在代码中出现的先后位置,析构的顺序与构造顺序相反。

ISO C++ 2003中关于exit()的行为规范:

参考
[1] 知乎问题:C++ exit时没调析构?
[2] CSDN:exit函数和析构函数的关系