割り当てフック関数
_CrtSetAllocHook を使用して組み込まれたメモリ割り当て用のフック関数は、メモリの割り当て、再割り当て、および解放のたびに呼び出されます。この種のフック関数はさまざまな目的に利用できます。たとえば、メモリ不足の状態でアプリケーションの動作をテストしたり、割り当てパターンを調査したり、後から分析するために割り当て情報を記録したりなどの目的に利用できます。
[!メモ]
割り当てフック関数の中で C ランタイム ライブラリの関数を使用する場合は、「割り当てフック関数と C ランタイムのメモリ割り当て」で説明する制限事項があるので注意してください。
割り当て用のフック関数には、次のようなプロトタイプが必要です。
int YourAllocHook(int nAllocType, void *pvData,
size_t nSize, int nBlockUse, long lRequest,
const unsigned char * szFileName, int nLine )
_CrtSetAllocHook に渡すポインターは _CRT_ALLOC_HOOK 型です。これらは、CRTDBG.H で次のように定義されています。
typedef int (__cdecl * _CRT_ALLOC_HOOK)
(int, void *, size_t, int, long, const unsigned char *, int);
ランタイム ライブラリがフック関数を呼び出す場合、引数 nAllocType には、これから実行される割り当て処理の種類 (_HOOK_ALLOC、_HOOK_REALLOC、または _HOOK_FREE) が格納されます。メモリの解放または再割り当ての場合、引数 pvData には、解放されるブロックへのポインターが格納されます。一方、割り当ての場合は、まだ割り当てが行われていないため、このポインターは null になります。その他の引数には、必要に応じて、対象ブロックの割り当てサイズ、ブロック型、順番に付けられた割り当て要求番号、割り当てが行われた場所のファイル名と行番号へのポインターが格納されます。フック関数は、分析などの必要な処理を実行した後で、割り当て処理を継続できる場合は TRUE、継続できない場合は FALSE を返すようにします。この種のフック関数の簡単なものとしては、それまでに割り当てられたメモリの総量をチェックし、その量が少なめに設定した上限を超えている場合は FALSE を返す関数が考えられます。この関数を使用すると、メモリがかなり不足している場合だけに発生するメモリ割り当てエラーを意図的に発生させることができます。さらに複雑なフック関数としては、割り当てパターンを追跡したり、メモリの使用状況を分析したり、特定の状態が発生したときにレポートを作成したりする関数が考えられます。