ヒープ関数

各プロセスには、システムによって提供される既定のヒープがあります。 ヒープから頻繁に割り当てるアプリケーションでは、プライベート ヒープを使用してパフォーマンスを向上させることができます。

プライベート ヒープは、呼び出し元プロセスのアドレス空間内の 1 つ以上のページのブロックです。 プライベート ヒープを作成した後、このプロセスでは HeapAllocHeapFree などの関数を使用してそのヒープ内のメモリを管理します。

ヒープ関数は、 GetProcessHeap 関数によって返されるハンドルを使用して、プロセスの既定のヒープ内のメモリを管理するためにも使用できます。 新しいアプリケーションでは、この目的のために グローバル関数とローカル 関数の代わりにヒープ関数を使用する必要があります。

プライベート ヒープから割り当てられたメモリと、他のメモリ割り当て関数を使用して割り当てられたメモリに違いはありません。 関数の完全な一覧については、「 メモリ管理機能」の表を参照してください。

Note

スレッドは、 GetProcessHeap 関数または HeapCreate 関数によって返されるハンドルを使用して、スレッドが作成および管理するプロセスの既定のヒープとプライベート ヒープに対してのみヒープ関数を呼び出す必要があります。

 

HeapCreate 関数は、呼び出し元プロセスが HeapAlloc 関数を使用してメモリ ブロックを割り当てることができるプライベート ヒープ オブジェクトを作成します。 HeapCreate は、ヒープの初期サイズと最大サイズの両方を指定します。 初期サイズは、ヒープに最初に割り当てられたコミット済み、読み取り/書き込みページの数を決定します。 最大サイズは、予約ページの合計数を決定します。 これらのページは、ヒープを拡張できるプロセスの仮想アドレス空間に連続したブロックを作成します。 HeapAlloc による要求がコミットされたページの現在のサイズを超えた場合、そのページの物理ストレージが使用可能であると仮定すると、この予約領域から追加のページが自動的にコミットされます。 ページがコミットされると、プロセスが終了するか、 HeapDestroy 関数を呼び出してヒープが破棄されるまで、コミット解除されません。

プライベート ヒープ オブジェクトのメモリには、それを作成したプロセスのみがアクセスできます。 ダイナミック リンク ライブラリ (DLL) がプライベート ヒープを作成する場合、DLL を呼び出したプロセスのアドレス空間で作成されます。 そのプロセスにのみアクセスできます。

HeapAlloc 関数は、プライベート ヒープから指定されたバイト数を割り当て、割り当てられたブロックへのポインターを返します。 このポインターは、 HeapFreeHeapReAllocHeapSizeHeapValidate 関数で使用できます。

HeapAlloc によって割り当てられたメモリは移動できません。 HeapAlloc によって返されるアドレスは、メモリ ブロックが解放されるか再割り当てされるまで有効です。メモリ ブロックをロックする必要はありません。

システムはプライベート ヒープを圧縮できないため、断片化される可能性があります。 さまざまな割り当てサイズで大量のメモリを割り当てるアプリケーションでは、 断片化の少ないヒープ を使用してヒープの断片化を減らすことができます。

ヒープ関数を使用するには、プロセスの起動時にプライベート ヒープを作成し、プロセスのメモリ要件を満たすのに十分な初期サイズを指定します。 HeapCreate 関数の呼び出しが失敗した場合、プロセスは終了するか、メモリ不足をユーザーに通知できます。ただし、成功した場合、プロセスは必要なメモリを持つことが保証されます。

HeapCreate によって要求されたメモリは、連続している場合とそうでない場合があります。 HeapAlloc によってヒープ内に割り当てられたメモリは連続しています。 HeapAlloc によって割り当てられたことを除き、ヒープ内のメモリに対して書き込みまたは読み取りを行ったりしないでください。また、HeapAlloc によって割り当てられたメモリの 2 つの領域間のリレーションシップを想定する必要もありません。

HeapFree によって解放されたメモリを参照しないでください。 メモリが解放されると、その中に存在していた可能性のある情報は永遠に失われます。 情報が必要な場合は、情報を含むメモリを解放しないでください。 メモリに関する情報 ( HeapSize など) を返す関数呼び出しは、解放されたメモリでは使用できません。これは、偽データを返す可能性があるためです。

HeapDestroy 関数は、プライベート ヒープ オブジェクトを破棄します。 ヒープ オブジェクトのすべてのページをコミットして解放し、ハンドルをヒープに無効化します。

メモリ割り当て方法の比較