次の方法で共有


HeapCompact 関数 (heapapi.h)

指定したヒープ内でコミットされた最大の空きブロックのサイズを返します。 空き グローバル フラグで Disable ヒープ合体が設定されている場合、この関数はヒープ内の隣接する空きメモリ ブロックも結合します。

構文

SIZE_T HeapCompact(
  [in] HANDLE hHeap,
  [in] DWORD  dwFlags
);

パラメーター

[in] hHeap

ヒープへのハンドル。 このハンドルは、HeapCreate または GetProcessHeap 関数 によって返されます。

[in] dwFlags

ヒープ アクセス オプション。 このパラメーターには、次の値を指定できます。

価値 意味
HEAP_NO_SERIALIZE
0x00000001
シリアル化されたアクセスは使用されません。

詳細については、「解説」を参照してください。

この関数のすべての呼び出しでシリアル化されたアクセスが無効になっていることを確認するには、HeapCreateの呼び出しで HEAP_NO_SERIALIZE 指定します。 この場合、この関数呼び出しで HEAP_NO_SERIALIZE を追加で指定する必要はありません。

プロセス ヒープにアクセスするときは、この値を指定しないでください。 システムは、Ctrl + C ハンドラーなど、アプリケーションのプロセス内でプロセス ヒープに同時にアクセスする追加のスレッドを作成できます。

戻り値

関数が成功した場合、戻り値はヒープ内の最大コミット済みフリー ブロックのサイズ (バイト単位) です。

関数が失敗した場合、戻り値は 0 です。 拡張エラー情報を取得するには、GetLastError呼び出します。

ヒープに空き領域がまったく存在しない場合、関数の戻り値は 0 で、GetLastError は値NO_ERRORを返します。

備考

HeapCompact 関数は、主にデバッグに役立ちます。 通常、システムは、HeapFree 関数が呼び出されるたびにヒープを圧縮し、HeapCompact 関数はヒープ内で最大の空きブロックのサイズを返しますが、ヒープをさらに圧縮しません。 デバッグ中に Disable heap coalesce on free グローバル フラグが設定されている場合、システムはヒープを圧縮せず、HeapCompact 関数を呼び出すとヒープが圧縮されます。 グローバル フラグの詳細については、GFlags ドキュメントを参照してください。

HeapCompactによって返されるサイズのメモリ ブロック アプリケーションが正常に割り当てられる保証はありません。 他のスレッドまたはコミットのしきい値によって、このような割り当てが妨げる可能性があります。

シリアル化により、2 つ以上のスレッドが同じヒープからブロックを同時に割り当てまたは解放しようとしたときに、相互の除外が保証されます。 シリアル化にはパフォーマンス コストは小さくなりますが、複数のスレッドが同じヒープからメモリを割り当てて解放するたびに使用する必要があります。 HEAP_NO_SERIALIZE 値を設定すると、ヒープでの相互の除外がなくなります。 シリアル化を使用しない場合、同じヒープ ハンドルを使用する 2 つ以上のスレッドが同時にメモリの割り当てまたは解放を試み、ヒープの破損を引き起こす可能性があります。 したがって、HEAP_NO_SERIALIZE 値は、次の状況でのみ安全に使用できます。

  • プロセスにはスレッドが 1 つだけ含まれます。
  • プロセスには複数のスレッドがありますが、特定のヒープのヒープ関数を呼び出すスレッドは 1 つだけです。
  • プロセスには複数のスレッドがあり、アプリケーションは特定のヒープに対して相互に除外するための独自のメカニズムを提供します。

必要条件

要件 価値
サポートされる最小クライアント Windows XP [デスクトップ アプリ |UWP アプリ]
サポートされる最小サーバー Windows Server 2003 [デスクトップ アプリ |UWP アプリ]
ターゲット プラットフォーム の ウィンドウズ
ヘッダー heapapi.h (Windows.h を含む)
ライブラリ Kernel32.lib
DLL Kernel32.dll

関連項目

ヒープ関数の

HeapCreate の

HeapValidate の

メモリ管理機能の

VBS エンクレーブ で使用できる Vertdll API