2017-02-18 18 views
0

私はMFC C++プログラムを持っており、明白な理由でエラー終了時にクラッシュすることがあります。私の具体的な質問は次の通りです:Untidyプログラムの終了:MFC C++

私のInitInstance()のオーバーロードには、さまざまなチェックや、イベントやセマフォのようなリソースの設定があります。ユーザーが通常の終了を要求すると、リソースを解放するなど、すべてを終了するOnDestroy()メッセージハンドラがあります。そのビットは正常に動作します。

問題はInitInstance()のチェックの1つが失敗し、関数が値0(プログラムが終了する)を返すときに発生します。私の質問はこれです:そのイベントでは、OnDestroy()は自動的に呼び出すか、InitInstanceを終了する前にそれを自分で実行する必要がありますか?

+0

代わりにデバッガに質問してみませんか? 'OnDestroy()'にブレークポイントを設定し、何が起こるかを見てください。また、プロセスは「明白な理由なしに」クラッシュしません*。この理由は、Win32例外が発生したときにブレークするようにデバッガを設定すると明らかになります。無力にしないでください。 – IInspectable

+0

あなたのプログラムのメインプログラムよりも寿命の長いスレッドまたはミューテックスはありますか?彼らは主な出口の後で閉鎖されるはずですが、手動で修正する必要があるMSVCバグがあります。 – ark1974

+1

@ ark1974:コントロールがユーザー提供のエントリポイント( 'main'ではなくGUIプログラムで' WinMain'と呼ばれています)を離れるとき、クリーンアップが実行されるかどうかはほとんど関係ありません。プロセスは終了しようとしており、OSはすべてのリソースを再利用します。あなたが参照している* "バグ" *がわからない – IInspectable

答えて

0

メインウィンドウのウィンドウが既に存在する場合は、DestroyWindowを使用する前にそのウィンドウを破壊する必要があります。いいえ、InitInstanceがFALSEで終了したときに自動的に破棄されることはありません。 ExitInstanceが実行されますが、アプリケーションが終了すると既存のウィンドウが閉じられます。

アプリケーションが存在する場合でも、ファイルやメモリなどの任意のノーマルリソースは解放されます。

関連する問題