次のようなアプリケーションの 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
が削除されていることがわかります。
ここで何が間違っていますか?コンソール ウィンドウのクローズ イベントで割り当てを解除するより良い方法はありますか?