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

Fab*_*ian 5 c++ destructor terminate windows-7

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

我可以以某种方式确保调用我的析构函数吗?如果我关闭窗口到底会发生什么?有没有一种“更软”的方式来关闭程序?

Adr*_*tti 3

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

首先声明一个函数,Windows 将使用HandlerRoutine给出的原型来调用该函数:

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

    return FALSE;
}
Run Code Online (Sandbox Code Playgroud)

现在,在开始循环之前,使用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;
}
Run Code Online (Sandbox Code Playgroud)

这样就完成了。您可以显式删除要处置的对象,或者简单地设置一个标志来打破无限循环。

请注意,您将收到更多事件(Windows shutdown CTRL_SHUTDOWN_EVENT、用户注销CTRL_LOGOFF_EVENT、用户中断CTRL_C_EVENT、关闭CTRL_CLOSE_EVENT),处理您需要/想要的事件。