Fre*_*Foo 12 c c++ unix destructor exit
C99提供了_Exit功能,"立即"退出,但它确实可以关闭文件描述符.Unix/POSIX通过强制关闭所有fd而不刷新(并提供同义词_exit)来扩展此行为.
static当从C++程序调用时,这些函数是否会调用对象的析构函数?C++标准是否有任何保证_Exit?
(受这个问题的启发;我突然想知道典型的情况会发生什么fork- exec- _exitC++中的习语.)
bdo*_*lan 11
首先,任何形式的程序退出都不会自动调用堆对象的析构函数(隐含在ISO/IEC 14882:1998(E)12.4.10中).
调用exit()不会为具有自动持续时间的对象调用析构函数,因为它不会通过其封闭范围返回(3.6.1.4).但是,将按照构造的相反顺序调用静态对象的析构函数(18.3.8).
调用abort()不会为任何类型的对象调用任何析构函数,也不会调用atexit()已注册的函数(18.3.3).我在这里的C++标准副本有点过时,没有提及_exit或_Exit直接,但我想,如果存在,它们应该表现相同 - 也就是说,不要调用任何析构函数.特别是,在C99标准中,_Exit()跳过atexit处理程序(实现定义是否刷新流缓冲区,关闭打开的流,还是删除临时文件).
进一步注意,abort()可以通过捕获信号取消SIGABRT(ISO/IEC 9899:1999(E)7.20.4.1.2 - 我这里只有C99,但我希望它在C++引用的版本中是相同的)._Exit()不能.
在一个更实际的音符,在大多数UNIX实现abort()和_exit(),abort()引发了SIGABRT而_exit()只是调用操作系统调用立即终止进程.这意味着主要的区别是:
_exit()abort() 可能被信号处理程序困住abort()可能会导致核心转储或类似情况在一种fork()/exec()模式中,_exit()可能更可取,以避免核心转储的可能性.
Mat*_*hen 10
它在标准C++中根本不存在,因此无法保证.
这是计划纳入C++ 0x中.这指定(§18.5):
函数_Exit(int status)在本国际标准中有其他行为:
- 程序终止而不执行自动,线程或静态存储持续时间对象的析构函数,并且不调用传递给atexit()的函数(3.6.3).
跟进:
ISO于2011年8月12日批准了C++ 0x.