またまたお世話になります。
VS2008 MFCでMDIのアプリケーションを作成しています。
Detected memory leaks!(メモリーリーク)のメッセージを出すか出さないか設定するような箇所がありましたら教えて下さい。
コーディングしているうちにいつの間にかメモリーリークの警告が出なくなってしまいました。
テンプレートからプロジェクトを作成した直後は
例えば
int* p = new int[1000];
return;
のようなコードを書くと終了時出力ペインに
Detected memory leaks!
…
と表示されますが
今は明らかにリークしていても警告が出ません。
明示的に
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
と記述すれば警告が出るのですが
いつの間にか警告が出なくなった原因と、デフォルトで警告が出る仕組みを知りたくて投稿しました。
宜しくお願いします。
.cppファイルの最初に
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
が、ないとかじゃないですか。
お返事ありがとうございます。
残念ながら#ifdef_DEBUG〜の記述がある箇所でも
現象は変わりません。
ソースを提示できるとよいのですが掲示板に乗せることができません。
気になる現象としては以下になります。
・リーク警告が出ない。
・終了時の出力ペインに「コード 3 (0x3) で終了しました。」と表示される。
・CDockablePane派生クラスメンバのCDialog派生(Create作成)の
デストラクタにブレイクポイントを置いても終了時に呼び出されない。
終了コードの3(0x3)も気になります。
Googleで調べて同じような人もいることがわかりましたが
解決方法まではわかりませんでした。
ブレイクポイントで止まるはずの場所で停止しないなど
ソースに問題がないのに明らかに挙動がおかしい場合は中間ファイルを
すべて削除して再ビルドするだけでも問題が解消することがあります。
ソースファイルが過去日付に戻る場合は再コンパイルの対象にならないので、
デバッグの過程でソースファイルをバックアップから戻した場合などに起こりえます。
可能性は低そうですが、もし心当たりがあれば試してみる価値はあるかもしれません。
subaru様
お返事ありがとうございます。
試してみましたが現象は変わりません。
ソースをゼロから作成し直して
原因を探してみようかと思います。
原因がわかったらまたこちらの掲示板で報告致します。
自己解決です。
結論としてはプログラム終了時に無効なコントロールにアクセスしていた
ことが要因となっていました。
・CDockablePane派生クラス(Cxxx)にCDialog派生(Create作成:Cyyy)の
メンバ変数を持つ。
・Cyyyにツリーコントロール(Czzz)を貼り付ける。
上記プログラムの
CyyyのデストラクタでCzzzのDeleteAllItems()を呼んでいたことが
今回の現象の原因となっていました。
Cyyyのデストラクタがコールされた時点でCzzzはウィンドウが無効になって
いるのでAssertやアクセスバイオレーションが発生するのであれば納得できるのですが…
実際はDeleteAllItems()でブレークするとF10を押した直後にVCのデバッグ実行が終了し、終了コード3となります。次行は実行しないため
他のデストラクタも呼ばれません。
尚、同じように無効なコントロールに対するアクセスを
プログラム起動中に行うとAssertが発生します。
VCの仕様なのかなぁ???
ツイート | ![]() |