C ランタイム (CRT) ライブラリには、ヒープ割り当て関数の特別なデバッグ バージョンが含まれています。 これらの関数の名前は Release バージョンと同じで、 _dbg が追加されています。 この記事では、例としてmallocと_malloc_dbgを使用して、CRT 関数のリリース バージョンと_dbg バージョンの違いについて説明します。
デバッグ ビルドでの動作
_DEBUGが定義されている場合、CRT はすべてのmalloc呼び出しを_malloc_dbgにマップします。 そのため、デバッグ中に利点を得るためにmallocの代わりに、_malloc_dbgを使用してコードを書き直す必要はありません。
しかし、明示的に _malloc_dbg を呼び出すこともできます。 明示的に _malloc_dbg を呼び出すと、さらに次の利点があります。
_CLIENT_BLOCK型の割り当てを追跡できます。割り当て要求が発生したソース ファイルと行番号を格納できます。
malloc呼び出しを_malloc_dbgに変換しない場合は、_CRTDBG_MAP_ALLOCを定義してソース ファイル情報を取得できます。これにより、プリプロセッサは、mallocのラッパーに依存するのではなく、mallocへのすべての呼び出しを_malloc_dbgに直接マップします。
クライアント ブロック内の個々の割り当て型を追跡するには、_malloc_dbg パラメーターを blockType に設定して、直接 _CLIENT_BLOCK を呼び出す必要があります。
非デバッグ ビルドでの動作
_DEBUGが定義されていない場合、mallocの呼び出しは応答されず、_malloc_dbgの呼び出しはmallocに解決され、_CRTDBG_MAP_ALLOCの定義は無視され、割り当て要求に関連するソース ファイル情報は提供されません。 mallocにはブロック型パラメーターがないため、_CLIENT_BLOCK型の要求は標準割り当てとして扱われます。