为什么单击控制台上的关闭按钮时未调用析构函数?

Why is a destructor not called when I click the close button on the console?

我在Windows 7 上有一个命令行应用程序。它主要由一个死循环组成。当我点击命令行控制台window的关闭按钮时,它似乎被瞬间杀死了。但是,我在析构函数中关闭了 SQLite 数据库连接,所以我担心数据库可能已损坏。即使没有,我也希望能够正确终止我的对象(可能通过向文件写入内容、记录日志等方式)。

我能否以某种方式确保我的析构函数被调用?如果我关闭 window 会发生什么?有没有 "softer" 关闭程序的方法?

控制台应用程序没有要求您退出的消息循环,但是 Windows 让您能够注册一个函数来接收 some 通知 您可能需要处理。其中之一是 关闭 通知。

首先声明一个 Windows 将为此目的调用的函数,原型由 HandlerRoutine:

BOOL WINAPI ConsoleHandlerRoutine(DWORD dwCtrlType) {
    if (CTRL_CLOSE_EVENT == dwCtrlType) {
        return TRUE;
    }

    return FALSE;
}

现在在开始循环之前使用 SetControlCtrlHandler 注册该函数:

int main(int argc, char* argv[])
{
    if (FALSE == SetConsoleCtrlHandler(ConsoleHandlerRoutine, TRUE)) {
        // Cannot register your handler? Check GetLastError()
    }

    while (true)
    {
        // This is your loop
    }

    return 0;
}

大功告成。您可以显式删除要处理的对象或简单地设置一个标志来打破无限循环。

请注意,您将收到更多事件(Windows 关闭 CTRL_SHUTDOWN_EVENT、用户注销 CTRL_LOGOFF_EVENT、用户中断 CTRL_C_EVENT、关闭 CTRL_CLOSE_EVENT) , 处理你 need/want.