[MFC]プログラムの終了時のデストラクタ

[戻る]
reshia [HomePage] 2005/02/20(日) 00:51:44
いつもお世話になっています。

VC++.NET、MFCを使っていまして、プログラムを終了させるときに、
クラス内で使ったオブジェクトを解放したかったので、PostQuitMessage(0);
をしましたけど、この後、デストラクタが呼ばれなくて困っています。
試しに、PostMessage(WM_CLOSE);もDestroyWindow();もやってみましたけど同じです。
(というか、これらの違いは?)

具体的には、CWndをpublic継承したクラスで、
ウィンドウのある部分をクリック後に、ウィンドウに処理結果を表示し、
その後、条件を満たしていればプログラムを終了
のようなプログラムなんですけど、ここで解放したいのは
CBitmapオブジェクトと、CDCオブジェクトです。

よろしくおねがいします。

BB 2005/02/20(日) 12:36:28
>VC++.NET、MFCを使っていまして、プログラムを終了させるときに、
>クラス内で使ったオブジェクトを解放したかったので、PostQuitMessage(0);
>をしましたけど、この後、デストラクタが呼ばれなくて困っています。
>試しに、PostMessage(WM_CLOSE);もDestroyWindow();もやってみましたけど同じです。
>(というか、これらの違いは?)

SDI/MDIのCMainFrameはCWinApp::InitInstanceでnewされています。
OnCloseで(あれこれやりながら)DestroyWindowが呼ばれ、さらにOnDestroyで
PostNcDestroyが呼ばれ、CFrameWnd::PostNcDestroyでdelete this されて、
デストラクタが呼ばれます。 

CMainFrame以外のクラスをメインウィンドウにする場合は、
PostNcDestroyを追加して、delete this と記述する必要があります。
( CWnd::PostNcDestroyは何もしていない。)

ちなみにPostQuietMessageはウィンドウの破棄はされないまま終了してしまいます。

>具体的には、CWndをpublic継承したクラスで、
>ウィンドウのある部分をクリック後に、ウィンドウに処理結果を表示し、
>その後、条件を満たしていればプログラムを終了
>のようなプログラムなんですけど、ここで解放したいのは
>CBitmapオブジェクトと、CDCオブジェクトです。

CBitmapもCDCもクラスですから、静的オブジェクトであれば必ずデストラクタは呼ばれます。
他のクラスのメンバオブジェクトであれば、そのクラスのデストラクタが呼ばれた時です。
それが呼ばれていないから開放できていないのでは?

reshia [HomePage] 2005/02/20(日) 17:26:47
[[解決]]
> PostNcDestroyを追加して、delete this と記述する必要があります。
で、できました。

ありがとうございました。

古いスレッドには追加発言できません。