<Return[H]><Top>

HeapCompact

Declare Function Api_HeapCompact& Lib "kernel32" Alias "HeapCompact" (ByVal hHeap&, ByVal dwFlags&)

Declare Function HeapCompact Lib "kernel32" Alias "HeapCompact" (ByVal hHeap As Long, ByVal dwFlags As Long) As Long

指定されたヒープをコンパクトにする。隣接する空きメモリブロックを結合し、大きな空きメモリブロックをコミットされていない状態に変更することにより、ヒープをコンパクトにする。

パラメータ
hHeap
    コンパクトにしたいヒープのハンドルを指定する。
dwFlags
    関数が動作している間のヒープアクセスを制御する一連のビットフラグを指定する。次のフラグが定義されている。

    値                                     

意味                                                                                                                     

    HEAP_NO_SERIALIZE

HeapCompact 関数がヒープにアクセスしている間、相互排他を使わないよう指定する。


戻り値
    関数が成功すると、ヒープ内の最大のコミット済み空きブロックのバイト単位のサイズが返る。

    これは符号なし整数(unsigned int)の値である。
    関数が失敗すると、0 が返る。拡張エラー情報を取得するには、GetLastError 関数を使う。
    利用可能なスペースがヒープ内にまったく存在しない可能性が低い場合は、この関数は 0 を返し、GetLastError 関数は NO_ERROR 値

    を返す。

解説
    アプリケーションが、HeapCompact 関数が返したサイズのメモリブロックの確保に成功する保証はない。他のスレッドや、コミットのしきい値

    が原因で、失敗することがある。
    複数のスレッドが同じヒープのブロック確保や解放を同時に行おうとする場合、それらをシリアル化することにより、相互排他動作が保証され

    る。シリアル化を実行するとパフォーマンスのコストがある程度発生するが、複数のスレッドが同じヒープでメモリの確保や解放を行おうとする

    ときは、シリアル化を行わなければならない。HEAP_NO_SERIALIZE フラグをセットすると、ヒープでの相互排他が防止できる。シリアル

    化を行わない場合、複数のスレッドが同じヒープハンドルを使ってメモリの割り当てまたは解放を同時に行おうとすると、ヒープ内のデータが

    壊れるはずである。そのため、HEAP_NO_SERIALIZE フラグを安全に利用できるのは、次の状況に限られる。
    •プロセスが1つのスレッドを保持している。
    •プロセスが複数のスレッドを保持していて、特定のヒープに対して1つのスレッドがヒープ関数を呼び出している。
    •プロセスが複数のスレッドを保持していて、アプリケーションが特定のヒープに対して相互排他を実現するための独自のメカニズムを提供して

    いる。
    注:アクセス違反を防止するために、構造化例外処理を使って、コードがヒープへの書き込みや読み取りを行うことを禁止する。