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

时间:2015-06-15 10:33:43

标签: c++ windows-7 destructor terminate

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

我可以以某种方式确保我的析构函数被调用吗?如果我关上窗户会发生什么?是否有更软的"关闭程序的方法?

1 个答案:

答案 0 :(得分:2)

控制台应用程序没有要求您退出的消息循环,但是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),处理您需要的内容/想。