2

次のようなアプリケーションの 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が削除されていることがわかります。

ここで何が間違っていますか?コンソール ウィンドウのクローズ イベントで割り当てを解除するより良い方法はありますか?

4

3 に答える 3