11

我想知道注册的函数atexit()是在全局变量被销毁之前还是之后被调用的。这是由定义的标准或实现指定的吗?

4

1 回答 1

20

它是明确定义的,取决于所讨论的对象是在函数注册之前还是之后构造的atexit()

3.6.3 终止

3.如果具有静态存储持续时间的对象的初始化完成在调用之前排序std::atexit(参见<cstdlib>18.5),则对传递给的函数std::atexit的调用在调用对象的析构函数之前排序。如果在std::atexit具有静态存储持续时间的对象的初始化完成之前对 的调用进行排序,则对对象的析构函数的调用将在对传递给的函数的调用之前进行排序std::atexit。如果对 的调用std::atexit在另一个调用之前排序std::atexit,则传递给第二个std::atexit调用的函数调用将在传递给第一个std::atexit调用的函数调用之前排序。

我的外行对上述内容的解释是,在你调用之前构建的东西在调用之后atexit(handler)被销毁,反之亦然。我确信有一些微妙之处,但这似乎是基本原则。 handler()

于 2012-11-27T14:33:46.693 回答