メモリー・ヒープをデバッグする関数

正規メモリー管理関数およびユーザー定義のヒープ・メモリー管理関数の両方のためのデバッグ・バージョンが使用可能です。 各デバッグ・バージョンは、対応する非デバッグ・バージョンと同じ機能を実行します。 ユーザーは、共用メモリー・ヒープを含むどのタイプのヒープに対しても使用可能です。 各々のデバッグ関数の呼び出しも、_heap_check (以下で説明) を呼び出して 自動的にヒープをチェックし、メモリー問題のデバッグに使用できる、ファイル名、行番号を含む 情報を提供します。 ユーザー定義のデバッグ・バージョンの名前には _debug_u という プレフィックスが付き (例えば、_debug_umalloc)、そして umalloc.h 内に定義されます。

すべてのデバッグ・メモリー管理関数の完全なリストと詳細については、『メモリー・デバッグ・ライブラリー関数』を参照してください。

表 1. メモリー・ヒープをデバッグする関数
デフォルトの
ヒープ関数
対応するユーザー作成ヒープ関数
_debug_calloc _debug_ucalloc
_debug_malloc _debug_umalloc
_debug_heapmin _debug_uheapmin
_debug_realloc 適用外
_debug_free 適用外
これらのデバッグ・バージョンを使用するには、以下の手順のいずれかを行います。

ユーザー作成ヒープ関数を呼び出すアプリケーションをコンパイルするには、ユーザー作成ヒープ使用のプログラムのコンパイルとリンク を参照してください。

注:
  1. -qheapdebug オプションを指定すると、すべての関数のローカル変数を事前初期化するためのコードが生成されます。 これにより、初期化されていないローカル変数が通常のデバッグ・サイクル中に見つかる可能性が、 それよりずっと後 (通常はコードが最適化されるとき) に見つかる可能性よりも大きくなります。
  2. -brtl オプションは -qheapdebug と一緒には使用しないでください。
  3. #pragma strings (readonly) ディレクティブは、デバッグ関数を呼び出す各ソース・ファイルの先頭、 または各ソース・ファイルが組み込む共通のヘッダー・ファイル内に置いてください。 このディレクティブは必須ではありませんが、このディレクティブによって、デバッグ関数へ受け渡すファイル名が上書きされないことと、オブジェクト・モジュールに組み込まれる ファイル名ストリングのコピーが 1 つのみであることが保証されます。

メモリー・ヒープをデバッグする追加の関数

次の 3 つの追加のデバッグ・メモリー管理関数には、対応する正規の関数はありません。 それらは下記の表にまとめられています。

表 2. メモリー・ヒープをデバッグする追加の関数
デフォルトの
ヒープ関数
対応するユーザー作成ヒープ関数 説明
_dump_allocated _udump_allocated デバッグ関数によって現在割り当てられている各メモリー・ブロックに関する情報を stderr に印刷します。
_dump_allocated_delta _udump_allocated_delta _dump_allocated または _dump_allocated_delta の最後の呼び出し以降に、 デバッグ関数によって割り当てられた各メモリー・ブロックに関する情報をファイル記述子 2 に印刷します。
_heap_check _uheap_check デバッグ関数によって割り当てられた、または解放されたすべてのメモリー・ブロックをチェックして、 割り当てられたブロックの境界の外部、または空きメモリー・ブロック内に上書きが発生していないことを確認します。

_heap_check 関数はデバッグ関数によって自動的に呼び出されます。 ユーザーは明示的にこの関数を呼び出すこともできます。 次に、現在割り当てられている メモリー・ブロックの情報を表示するため、_dump_allocated または _dump_allocated_delta を 使用することができます。これらの関数は明示的に呼び出す必要があります。