何时使用atexit()调用注册的函数

Mir*_*pas 11 c++ destructor atexit

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

NPE*_*NPE 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()

  • 基本上,是的.标准中的措辞更复杂,因为在多线程程序中,"之前"和"之后"的定义很棘手,并不总是像您期望的那样行事. (4认同)