17
  1. 是否有可能以某种方式处理此事件?
  2. 在堆栈展开和静态/全局对象的释放方面会发生什么?
4

3 回答 3

13

控制台应用程序中的 Ctrl-C 将生成一个信号。此信号的默认处理程序调用 ExitProcess 来终止应用程序。您可以通过使用SetConsoleCtrlHandler函数为信号设置自己的处理函数来覆盖此行为。

于 2009-05-27T08:42:00.920 回答
7

编辑:SIGINT,而不是 SIGTERM。Assaf 报告说,没有任何对象因未经处理的 SIGINT 而被破坏(至少在 Windows 上)。

系统发送一个 SIGINT。这个概念适用于所有 C 实现(有一些差异)。为了处理它,你调用信号,指定一个信号处理程序。请参阅Open GroupMSDN上有关信号功能的文档。

第二个问题有点棘手,可能取决于实施。最好的办法是处理信号,它允许您使用deleteexit()手动。

于 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 回答