<Return[H]><Top>

HeapReAlloc

Declare Function Api_HeapReAlloc& Lib "kernel32" (ByVal hHeap&, ByVal dwFlags&, ByVal lpMem&, ByVal dwBytes&)

Declare Function HeapReAlloc Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal lpMem As Long, ByVal dwBytes As Long) As Long

ヒープからメモリブロックを再割り当てする。この結果、メモリブロックのサイズや他のプロパティを変更できる。割り当てられたメモリは移動できない。

パラメータ
hHeap
[入力]メモリの再割り当てを行いたいヒープのハンドルを指定する。HeapCreate 関数または GetProcessHeap 関数がこのハンドルを返す。
dwFlags
[入力]メモリの再割り当ての方法を制御するオプションを指定する。これらの値を指定すると、HeapCreate 関数を使ってヒープを作成したときに flOptions パラメータで指定された、対応する値が上書きされる。次の値のいずれかまたは任意の組み合わせを指定できる。

    値

意味

    HEAP_GENERATE_EXCEPTIONS

 

メモリ不足などの状況で関数が失敗したときに、NULL を返すのではなく、例外を発生させるようシステムに指示する。

    HEAP_NO_SERIALIZE

 

 

HeapReAlloc 関数がヒープにアクセスしている間、相互排他を行わないよう指示する。
プロセスヒープにアクセスする場合は、この値を指定すべきではない。一方、システムはアプリケーションプロセス内に、プロセスヒープに同時にアクセスする Ctrl+C ハンドラのような追加のスレッドを作成してもかまわない

    HEAP_REALLOC_IN_PLACE_ONLY

 

 

メモリブロックのサイズを拡大する場合に、メモリを移動しないよう指示する。この値を指定せず、より大きなサイズを指定して再割り当てを要求すると、メモリブロックが新しい位置へ移動することがある。この値が指定されていて、移動なしではブロックを拡大できない場合、この関数は失敗し、元のブロックが変化しないまま残る。

    HEAP_ZERO_MEMORY

 

この値を指定すると、メモリブロックのサイズを拡大する場合、元のサイズを上回る追加のメモリ領域の内容を 0 に初期化する。元のサイズ内のメモリブロックの内容は変化しない。

lpMem
    [入力]再割り当てしたいメモリブロックへのポインタを指定する。HeapAlloc 関数または HeapReAlloc 関数が返すポインタである。
dwBytes
    [入力]メモリブロックの新しいサイズをバイト単位で指定する。この関数を使うと、メモリブロックのサイズを増加または減少させることがで

    きる。
    hHeap パラメータを使って「拡張不可能」なヒープを指定した場合、0x7FFF8 より小さな値を指定しなければならない。dwMaximumSize

    に 0 以外の値を指定して HeapCreate 関数を呼び出すと、拡張不可能なヒープを作成できる。

戻り値
    関数が成功すると、再割り当てされたメモリブロックへのポインタが返る。
    HEAP_GENERATE_EXCEPTIONS を指定しなかった場合、関数が失敗すると、NULL が返る。
    HEAP_GENERATE_EXCEPTIONS を指定した場合、関数が失敗すると次の例外が生成される。

    値

意味

    STATUS_NO_MEMORY

メモリ不足のため、メモリの再割り当てに失敗した。

    STATUS_ACCESS_VIOLATION

 

ヒープが壊れていること、または関数のパラメータが不適切なことが原因で、メモリの再割り当てに失敗した。

    関数が失敗すると、この関数は 関数を呼び出する。拡張エラー情報を取得するには、 関数を使う。

解説
    HeapReAlloc 関数が成功すると、要求したバイト数と同じ、またはそれより多くのメモリが割り当てられる。要求したバイト数より多くのメモリ

    が割り当てられた場合、プロセスはそのメモリをすべて使用できる。実際に再割り当てされたバイト数を調べるには、HeapSize 関数を使

    う。
    HeapReAlloc 関数が失敗すると、元のメモリは解放されず、元のハンドルとポインタも有効なまま残る。
    HeapReAlloc 関数を使って割り当てたメモリブロックを解放するには、HeapFree 関数を使う。
    シリアル化を有効にすると、複数のスレッドが同じヒープでメモリブロックの割り当てまたは解放を行おうとしたときに、相互排他が保証され

    る。シリアル化を有効にすると、パフォーマンスは多少低下するが、複数のスレッドが同じヒープでメモリの割り当てまたは解放を行う場合

    は、必ずシリアル化を有効にしなければならない。HEAP_NO_SERIALIZE の値を指定すると、ヒープの相互排他が無効になる。シリア

    ル化が無効な場合、共通のヒープハンドルを使う複数のスレッドがメモリの割り当てまたは解放を同時に行う可能性があり、その場合はヒー

    プが壊れてしまう。そのため、HEAP_NO_SERIALIZE を安全に利用できるのは、次の条件のいずれかが成立する場合だけである。
    •プロセスがただ 1 つのスレッドを使っている。
    •プロセスが複数のスレッドを使っているが、特定のヒープに対してヒープ関数を呼び出すのはただ 1 つのスレッドである。
    •プロセスが複数のスレッドを使っているが、アプリケーションは特定のヒープで相互排他を実現するための独自のメカニズムを用意している。
    注意 アクセス違反を防止するために、構造化例外処理を使って、コードがヒープへの書き込みや読み取りを行うことを禁止する。
    Windows 95/98:ヒープマネージャは、4 メガバイト(MB)未満のメモリブロックを扱うように設計されている。メモリブロックが 1MB また

    は 2MB より大きくなることが予期される場合、代わりに VirtualAlloc または VirtualAllocEx 関数を使うことにより、パフォーマンスの大幅

    な低下を防止できる。