【发布时间】:2012-03-25 19:41:48
【问题描述】:
我的代码是这样的:
#include <iostream>
#include <signal.h>
#include <cstdlib>
void handler(int) {
std::cout << "will exit..." << std::endl;
exit(0);
}
class A {
public:
A() {std::cout << "constructor" << std::endl;}
~A() {std::cout << "destructor" << std::endl;}
};
int main(void) {
signal(SIGINT, &handler);
A a;
for (;;);
return 0;
}
当我按下 Ctrl-C 时,它会打印:
constructor
^Cwill exit...
没有打印“析构函数”。 那么,如何才能干净利落地退出呢?
【问题讨论】:
-
请注意,“正确”的答案并不像下面的一些回复所暗示的那样“微不足道”。例如,您应该考虑使用
sigaction而不是signal。此外,不在异步信号处理程序中使用exit()的主要原因是它只是not supported。在信号处理程序中使用iostreams也是如此(尽管我对此不是 100% 确定)。然后,使用普通的bool代替volatile std::sig_atomic_t可能不可靠或导致未定义的行为。 -
ppst.me/5cUMeA 为你写了这个小技巧,我发现这比使用全局变量来跟踪执行流程要干净得多。
-
@refp 问题是,它到处表现出未定义的行为。
-
@Christian.K 当前的实现,是的。如果您将对
signal的调用移至对handler的调用之后(带有两个参数),则它是not 未定义的行为。写的时候有点快,自己也想到了上面的,但是有个会议要参加。 -
如果你能负担得起特定平台的费用,请查看 gccs -fnon-call-exceptions
标签: c++ destructor signals