我有一个 C++ 控制台应用程序,它看起来像这样:
SomeObj* obj;
BOOL WINAPI closeHandler(DWORD cEvent)
{
obj->Stop();
while( obj != 0 )
{
Sleep(100);
}
return TRUE;
}
int main(int argc, char* argv[])
{
SetConsoleCtrlHandler( (PHANDLER_ROUTINE)SignalHandler, true );
obj = new SomeObj();
obj->Execute();
delete obj;
return 0;
}
SomeObj::Execute()
本质上是一个一直运行直到SomeObj::Stop()
被调用的循环。当我执行 CTRL+C 时,我可以看到应用程序obj
在退出之前已正确删除。但是,当我单击控制台窗口上的关闭按钮时,我发现obj
它没有被正确删除。
进一步的调试表明 closeHandler 实际上被调用了,但不知何故obj
并没有被删除。奇怪的是,如果我在该行上放置一个断点return 0
并尝试关闭控制台窗口,我最终会遇到该断点并看到它obj
已被删除。
我在这里做错了什么?有没有更好的方法来释放控制台窗口关闭事件中的东西?