次の方法で共有


ヒープ関数

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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