- 有没有办法以某种方式处理此事件?
- 在堆栈展开和静态/全局对象的释放方面会发生什么?
在控制台应用程序中,按下Ctrl-C会生成一个信号。该信号的默认处理程序将调用ExitProcess函数来终止应用程序。你可以使用SetConsoleCtrlHandler函数为信号设置自己的处理程序,以覆盖这种行为。
编辑:应该是SIGINT,而不是SIGTERM。Assaf报告称,在未处理的SIGINT情况下没有对象被销毁(至少在Windows上)。
系统发送一个SIGINT信号。这个概念适用于所有C实现(有些略有不同)。要处理它,您需要调用signal函数,并指定一个信号处理程序。请参阅Open Group和MSDN上关于signal函数的文档。
第二个问题比较棘手,可能取决于具体实现。最好的办法是处理信号,这样可以手动使用delete
和exit()
。
#include <iostream>
#include <windows.h>
using namespace std;
struct A {
~A() { cerr << "unwound" << endl; }
};
int main() {
A a;
while(1) {
Sleep(1000);
}
}
是否发生取决于实现方式,取决于运行时如何处理 Ctrl-C。根据我的经验,这种情况并不会发生。