こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Visual Studioのメモリリークについて

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

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

メモリリークの殆どは


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

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


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

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


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

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

よろしくお願いします。

投稿日時 - 2008-08-28 18:17:55

QNo.4285771

すぐに回答ほしいです

質問者が選んだベストアンサー

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

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

投稿日時 - 2008-08-29 09:52:53

お礼

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

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

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

投稿日時 - 2008-08-29 10:40:28

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問