【发布时间】:2011-03-11 21:43:47
【问题描述】:
我知道我的析构函数是在正常展开堆栈和抛出异常时调用的,但不是在调用 exit() 时。
还有其他情况我的析构函数不会被调用吗?诸如 SIGINT 或 SIGSEGV 之类的信号呢?我假设对于 SIGSEGV,它们不会被调用,但对于 SIGNINT 它们是,我怎么知道哪些信号会展开堆栈?
还有其他情况不会被调用吗?
【问题讨论】:
-
正如这里所指出的,thedailywtf.com/Articles/My-Tales.aspx,您还应该知道,拔出电源插头时不会调用析构函数;)。
-
SIGINT 不会展开堆栈,除非您安装了覆盖默认行为的信号处理程序。默认情况下,SIGINT 会导致程序立即终止。
-
不将此作为答案发布,因为它似乎更像是问题的疏忽。只有在具有静态、自动或线程存储持续时间的对象的生命周期结束时才会自动调用析构函数(在正常情况下)。对于具有 动态 存储持续时间的对象,仅当在指向对象的指针上调用
delete时才调用析构函数。因此,对于从未调用过delete的动态对象,不会调用析构函数(无论是因为内存泄漏使这成为不可能,还是由于疏忽)。
标签: c++ exception signals destructor exit