メモリーリークの原因がわからない

[戻る]
TKF3 2008/07/09(水) 10:11:26
TKF3といいます。
環境は、WinXP(SP3) VC++6 MFC です。

作成したソフト終了時に、以下のメッセージが表示されます。
----------------------------------------------------------------------
Detected memory leaks!
Dumping objects ->
oleinit.cpp(86) : {84} client block at 0x00D25F98, subtype 0, 64 bytes long.
a CCmdTarget object at $00D25F98, 64 bytes long
Object dump complete.
スレッド 0x360 終了、終了コード -17891602 (0xFEEEFEEE)。
----------------------------------------------------------------------

メモリーリークを起こしているのはわかります。
しかし、色々と調査してはいるのですが、
原因を特定できていません。


どなたか、ご教授おねがいします。

ん? 2008/07/09(水) 12:16:48
開放していないから…としか、言い様が無い。

bun 2008/07/09(水) 12:23:35
oleinit.cpp(86)と表示されているんで、その場所を見てみましょう。

すると、AfxOleInit() 関数の中で
  pThread->m_pMessageFilter = new COleMessageFilter;
としているのが分かります。

なんとなく、AfxOleInit() に対応しそうな、AfxOleTerm()がすぐ下にあるので
ざっと眺めると、115行目に
  delete pThread->m_pMessageFilter;
とあります。

そんなわけで、AfxOleTerm()の呼び忘れの可能性が高いかと、
原因そのものよりも、調べ方が伝わったなら幸いです。

TKF3 2008/07/09(水) 13:21:05
>ん?さん
すいません、文章の説明不足でした。
エラーメッセージにある「oleinit.cpp」は、自分では記述していません。
調べてみると、
C:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC
に格納されていました。

自分では心当たりのないエラーだったので、原因がわからない状態です。

>bunさん
返信ありがとうございます。

>なんとなく、AfxOleInit() に対応しそうな、AfxOleTerm()がすぐ下にあるので
>ざっと眺めると、115行目に
>  delete pThread->m_pMessageFilter;
>とあります。

>そんなわけで、AfxOleTerm()の呼び忘れの可能性が高いかと、
>原因そのものよりも、調べ方が伝わったなら幸いです。

AfxOleTerm()関数の先頭で、ブレークポイントを設置してみました。
すると、終了時に関数自体はコールされていました。
ただし、109行目のif (!bJustRevoke)でbJustRevoke=1のために、
delete pThread->m_pMessageFilter;
の処理に流れないということまでわかりました。

現時点では、AfxOleTerm()について、検索している最中です。

TKF3 2008/07/09(水) 13:38:57
[[解決]]
解決しました!

試しに、AfxOleTerm(FALSE);をデストラクタに記述したところ、
エラーメッセージは消え、
スレッド 0x360 終了、終了コード -17891602 (0xFEEEFEEE)。
という記述になりました。

ここで、終了コードが異常値なので、終了時のコードを追った所、
CMainFrame::OnClose()の関数の中に、余計なコードが記述していました。

結果を言うと、自分のミスでした。

レスいただいた方ありがとうございました。
お騒がせしました。

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