HeapValidate 関数 (heapapi.h)
指定したヒープを検証します。 関数は、ヒープ内のすべてのメモリ ブロックをスキャンし、ヒープ マネージャーによって維持されるヒープ制御構造体が一貫した状態であることを確認します。 HeapValidate 関数を使用して、ヒープ全体の有効性を確認せずに、指定したヒープ内の 1 つのメモリ ブロックを検証することもできます。
構文
BOOL HeapValidate(
[in] HANDLE hHeap,
[in] DWORD dwFlags,
[in, optional] LPCVOID lpMem
);
パラメーター
[in] hHeap
検証するヒープへのハンドル。 このハンドルは、 HeapCreate 関数または GetProcessHeap 関数によって返されます。
[in] dwFlags
ヒープ アクセス オプション。 このパラメーターには、次の値を指定できます。
値 | 意味 |
---|---|
|
シリアル化されたアクセスは使用されません。 詳細については、「解説」を参照してください。
この関数のすべての呼び出しでシリアル化されたアクセスが無効になるようにするには、HeapCreate の呼び出しで HEAP_NO_SERIALIZEを指定します。 この場合、この関数呼び出しで HEAP_NO_SERIALIZE を追加で指定する必要はありません。 プロセスの既定のヒープにアクセスするときは、この値を指定しないでください。 システムは、Ctrl + C ハンドラーなど、アプリケーションのプロセス内に、プロセスの既定のヒープに同時にアクセスする追加のスレッドを作成できます。 |
[in, optional] lpMem
指定したヒープ内のメモリ ブロックへのポインター。 このパラメーターは NULL である可能性があります。
このパラメーターが NULL の場合、関数は hHeap で指定されたヒープ全体の検証を試みます。
このパラメーターが NULL でない場合、関数は lpMem が指すメモリ ブロックの検証を試みます。 ヒープの残りの部分の検証は試行されません。
戻り値
指定したヒープまたはメモリ ブロックが有効な場合、戻り値は 0 以外です。
指定されたヒープまたはメモリ ブロックが無効な場合、戻り値は 0 です。 デバッグ用に設定されたシステムでは、 HeapValidate 関数は無効なヒープまたはメモリ ブロックの一部を記述するデバッグ メッセージを表示し、ハードコーディングされたブレークポイントで停止して、システムを調べて無効の原因を特定できるようにします。 HeapValidate 関数は、スレッドの最後のエラー値を設定しません。 この関数の拡張エラー情報はありません。 GetLastError を呼び出さないでください。
注釈
HeapValidate 関数は、検証に時間がかかる可能性があるため、デバッグに主に役立ちます。 ヒープを検証すると、他のスレッドがヒープにアクセスするのをブロックでき、特に対称マルチプロセッサ (SMP) コンピューターではパフォーマンスが低下する可能性があります。 これらの副作用は、 HeapValidate が返されるまで続く可能性があります。
ヒープ内の各メモリ ブロックとヒープ全体のヒープ制御構造があります。 HeapValidate 関数を使用して完全なヒープを検証すると、これらのすべての制御構造で一貫性がチェックされます。
HeapValidate を使用してヒープ内の 1 つのメモリ ブロックを検証すると、その要素に関連する制御構造のみがチェックされます。 HeapValidate では、割り当てられたメモリ ブロックのみを検証できます。 解放されたメモリ ブロックで HeapValidate を呼び出すと、検証するコントロール構造体がないため 、FALSE が返されます。
HeapWalk 関数によって列挙されたヒープ要素を検証する場合は、PROCESS_HEAP_ENTRY構造体の wFlags メンバーにPROCESS_HEAP_ENTRY_BUSYを持つ要素に対してのみ HeapValidate を呼び出す必要があります。 HeapValidate は、このビットが設定されていないすべてのヒープ要素に対して FALSE を 返します。
シリアル化により、2 つ以上のスレッドが同じヒープからブロックを同時に割り当てたり解放したりしようとすると、相互の除外が保証されます。 シリアル化にはパフォーマンス コストは小さくなりますが、複数のスレッドが同じヒープからメモリを割り当てて解放するたびに使用する必要があります。 HEAP_NO_SERIALIZE値を設定すると、ヒープでの相互除外がなくなります。 シリアル化を行わないと、同じヒープ ハンドルを使用する 2 つ以上のスレッドが同時にメモリの割り当てまたは解放を試み、ヒープが破損する可能性があります。 したがって、 HEAP_NO_SERIALIZE 値は、次の状況でのみ安全に使用できます。
- プロセスに含まれるスレッドは 1 つだけです。
- プロセスには複数のスレッドがありますが、特定のヒープに対してヒープ関数を呼び出すスレッドは 1 つだけです。
- このプロセスには複数のスレッドがあり、アプリケーションには特定のヒープへの相互除外のための独自のメカニズムが用意されています。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows XP (デスクトップ アプリのみ) |
サポートされている最小のサーバー | Windows Server 2003 (デスクトップ アプリのみ) |
対象プラットフォーム | Windows |
ヘッダー | heapapi.h (Windows.h を含む) |
Library | Kernel32.lib |
[DLL] | Kernel32.dll |