[VC]
普通にデバッグモードで実行すれば、こんな定義しなくても勝手にメモリリーク教えてくれるような・・・。おれの知らないところでだれかがなにか細工してくれているのかな?
フラグ | 説明 |
---|---|
_CRTDBG_ALLOC_MEM_DF | デバッグ用のヒープメモリが使われるようになります。ランタイムはこのヒープメモリを検査することでメモリリークを検出しているわけです。このフラグは普通設定します。 |
_CRTDBG_DELAY_FREE_MEM_DF | 解放し忘れの状態を意図的に作ります。これはメモリが少ない状態をシミュレートするのに効果的です。 |
_CRTDBG_CHECK_ALWAYS_DF | ヒープメモリを割り当てた時と解放した時に_CrtCheckMemory関数を毎回呼び出します。_CrtCheckMemory関数は確保したヒープメモリの整合性をチェックする関数です。メモリのオーバーランなどで動的確保部分が侵食されてしまうなど、整合性が破壊されてしまった時のチェックに使われます。毎回呼び出すので実行速度が遅くなってしまいますが、整合性エラーをすばやく検出できます。 |
_CRTDBG_CHECK_CRT_DF | Main関数(WinMain関数)が始まってからプログラムが完全に終わるまでのすべてのヒープメモリについてチェックが行われます。このフラグは普通設定しません。これを設定するとランタイムライブラリが確保したメモリについてもチェックが行われてしまい、大抵てんやわんやになります。 |
_CRTDBG_LEAK_CHECK_DF | プログラムの終了時に_CrtDumpMemoryLeaks を呼び出して、メモリ リークのチェックを行いデバッグウィンドウに出力します。割り当てたメモリを解放し忘れている場合にはエラーレポートが出力されます。普通設定するフラグです。 |
使い方
#include "stdafx.h" #include <crtdbg.h> int _tmain(int argc, _TCHAR* argv[]) { // メモリリーク検出 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); // ヒープメモリを確保 int *pNumber = new int[3]; pNumber[0] = 1; pNumber[1] = 2; pNumber[2] = 3; return 0; }
ネタ元