今日覚えたこと

_CrtSetDbgFlagについて

_CRTDBG_ALLOC_MEM_DF
デバッグ用のヒープメモリが使われるようになります。ランタイムはこのヒープメモリを検査することでメモリリークを検出しているわけです。このフラグは普通設定します。

_CRTDBG_DELAY_FREE_MEM_DF
解放し忘れの状態を意図的に作ります。これはメモリが少ない状態をシミュレートするのに効果的です。

_CRTDBG_CHECK_ALWAYS_DF
ヒープメモリを割り当てた時と解放した時に_CrtCheckMemory関数を毎回呼び出します。_CrtCheckMemory関数は確保したヒープメモリの整合性をチェックする関数です。メモリのオーバーランなどで動的確保部分が侵食されてしまうなど、整合性が破壊されてしまった時のチェックに使われます。毎回呼び出すので実行速度が遅くなってしまいますが、整合性エラーをすばやく検出できます。

_CRTDBG_CHECK_CRT_DF
処理が始まってからプログラムが完全に終わるまでのすべてのヒープメモリについてチェックが行われます。このフラグは普通設定しません。これを設定するとランタイムライブラリが確保したメモリについてもチェックが行われてしまい、大抵てんやわんやになります。(でたらめを吐き出す?)

_CRTDBG_LEAK_CHECK_DF
プログラムの終了時に_CrtDumpMemoryLeaks を呼び出して、メモリ リークのチェックを行いデバッグウィンドウに出力します。割り当てたメモリを解放し忘れている場合にはエラーレポートが出力されます。普通設定するフラグです。


とのこと。