Wil*_*mKF 43 c++ destructor signals exception exit
我知道我的析构函数在堆栈的正常展开时调用,并且在抛出异常时调用,但是在调用exit()时调用.
还有其他情况我的析构函数不会被调用吗?信号如SIGINT或SIGSEGV怎么样?我认为对于SIGSEGV,它们不会被调用,但对于SIGNINT它们是,我怎么知道哪些信号将展开堆栈?
还有其他情况不会被召唤吗?
sti*_*472 48
是否有任何其他情况下他们的[析构函数]不会被调用?
小智 7
C++标准没有提到具体如何信号必须被处理-很多实现可能不支持SIGINT
等,如果析构函数不会被调用exit()
或abort()
或terminate()
调用.
编辑:我刚刚通过C++标准进行了快速搜索,我找不到任何指定信号如何与对象生命周期交互的东西 - 也许有一个比我更好的标准的人能找到一些东西?
进一步编辑:在回答另一个问题时,我在标准中找到了这个:
在从范围退出(但是已完成)时,将为所有具有自动存储持续时间(3.7.2)(命名对象或临时值)的构造对象调用析构函数(12.4),这些对象在其范围内声明,其声明的顺序与其声明的顺序相反.
因此,似乎必须在收到信号时调用析构函数.