読者です 読者をやめる 読者になる 読者になる

メモリリークを調べる関数 _CrtSetDbgFlag

[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;
}

ネタ元