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



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

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

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

首先声明一个函数,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),处理您需要/想要的内容。

最新更新