【发布时间】:2010-10-29 05:08:54
【问题描述】:
- 能否以某种方式处理此事件?
- 在堆栈展开和释放静态/全局对象方面会发生什么?
【问题讨论】:
标签: c++ winapi console copy-paste
【问题讨论】:
标签: c++ winapi console copy-paste
控制台应用程序中的 Ctrl-C 将生成一个信号。此信号的默认处理程序调用 ExitProcess 来终止应用程序。您可以通过使用SetConsoleCtrlHandler 函数为信号设置自己的处理函数来覆盖此行为。
【讨论】:
编辑:SIGINT,而不是 SIGTERM。 Assaf 报告说,没有任何对象因未经处理的 SIGINT 而被破坏(至少在 Windows 上)。
系统发送一个 SIGINT。这个概念适用于所有 C 实现(有一些差异)。为了处理它,你调用信号,指定一个信号处理程序。请参阅Open Group 和MSDN 上有关信号功能的文档。
第二个问题有点棘手,可能取决于实现。最好的办法是处理信号,它允许您手动使用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。根据我的经验,它不会发生。
【讨论】: