- 是否有可能以某种方式处理此事件?
- 在堆栈展开和静态/全局对象的释放方面会发生什么?
问问题
3293 次
3 回答
13
控制台应用程序中的 Ctrl-C 将生成一个信号。此信号的默认处理程序调用 ExitProcess 来终止应用程序。您可以通过使用SetConsoleCtrlHandler函数为信号设置自己的处理函数来覆盖此行为。
于 2009-05-27T08:42:00.920 回答
7
编辑:SIGINT,而不是 SIGTERM。Assaf 报告说,没有任何对象因未经处理的 SIGINT 而被破坏(至少在 Windows 上)。
系统发送一个 SIGINT。这个概念适用于所有 C 实现(有一些差异)。为了处理它,你调用信号,指定一个信号处理程序。请参阅Open Group和MSDN上有关信号功能的文档。
第二个问题有点棘手,可能取决于实施。最好的办法是处理信号,它允许您使用delete
和exit()
手动。
于 2009-05-27T08:37:46.280 回答
4
您可以使用一些简单的代码测试是否发生堆栈展开:
#include <iostream>
#include <windows.h>
using namespace std;
struct A {
~A() { cerr << "unwound" << endl; }
};
int main() {
A a;
while(1) {
Sleep(1000);
}
}
它是否发生不应该取决于实现,取决于运行时如何处理 Ctrl-C。根据我的经验,它不会发生。
于 2009-05-27T08:49:19.640 回答