プロが教えるわが家の防犯対策術!

質問を見ていただいて有り難うございます。

当方、現在MFCのダイアログベースのプログラムを行なっているのですが、プログラム終了時にメモリリークが発生します。
今のところプログラムの動作自体に影響はないのですが、想定外の動作が起こると困るのでなんとかこのエラーを取り除きたいと考えています。

メモリリークの殆どは


_CrtSetBreakAlloc(Num);(指定した順序のメモリ割り当て時にブレークポイントを発生させる)

を利用して、メモリリークが起こっている部分のブレークポイントをチェックして消したのですが、どうしても残りのメモリリークが消えません。


残りのメモリリークは_CrtSetBreakAlloc(Num)で指定してもブレークポイントが出てきませんでした。

_CrtSetBreakAlloc(Num)は『ファイル名.cpp』のInitInstanceおよびコンストラクタで呼び出してみましたが、どちらも同じ結果になりました。


また、試しに『ファイル名Dlg』クラスを使用しない(ダイアログを開かないようにコメントアウト)ようにして終了しても同じ結果になりました。

_CrtSetBreakAlloc(Num)を設定する適切な位置や、このようなメモリリークが出る原因、解決方法などについてご存知の方がいらっしゃいましたら、お教えください。

よろしくお願いします。

A 回答 (1件)

ちょっときつい書き方をしますが、楽して解決する方法はありません。


この「楽して」というのは、_CrtSetBreakAlloc(Num)に頼りきっていることです。
プロセス内で複数のスレッドを起動した場合、スレッドを終了せずにプロセスを終了すると、_CrtSetBreakAlloc(Num)では発見できないことがあります。

>解決方法などについて
究極的には、メモリを確保するnew/create系の処理に対して、メモリを解放するdelete/closeがすべて行われているかソースを虱潰しに確認していくしかありません。
あとは、タスクマネージャーのプロセスタブで「メモリ使用量」「スレッドの数」「ハンドルの数」などを監視しながら操作を行い、前述の値がどのように変化するかであたりをつけていくことです。
    • good
    • 0
この回答へのお礼

御回答有り難うございます。

>楽して解決する方法はありません。
確かに関数に頼りきりだったように思います。ご指摘有り難うございます。

>>解決方法などについて
(普通に使用する場合の)new/create系の処理については既にチェックが終わり…というか、
mydlg.DoModal();(mydlgはダイアログベースで自作した初期起動時のダイアログ)
をコメントアウトし、そもそもnew/create関係が呼び出されないようにしてもメモリリークが発生するので、途方にくれています。
タスクマネージャについては完全に盲点でした。プログラムを走らせて確認してみます。

お礼日時:2008/08/29 10:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!