RtlAllocateHeap 関数 (ntifs.h)
RtlAllocateHeap ルーチンは、ヒープからメモリ ブロックを割り当てます。
構文
NTSYSAPI PVOID RtlAllocateHeap(
[in] PVOID HeapHandle,
[in, optional] ULONG Flags,
[in] SIZE_T Size
);
パラメーター
[in] HeapHandle
メモリの割り当て元となるプライベート ヒープのハンドル。 このパラメーターは、 RtlCreateHeap への正常な呼び出しから返されるハンドルです。
[in, optional] Flags
ヒープ割り当ての制御可能な側面。 これらの値のいずれかを指定すると、 ヒープが RtlCreateHeap で作成されたときに指定された対応する値がオーバーライドされます。 このパラメーターには、次の 1 つ以上の値を指定できます。
フラグ | 説明 |
---|---|
HEAP_GENERATE_EXCEPTIONS | システムは、 NULL を返す代わりに、メモリ不足状態などの関数エラーを示す例外を発生させます。 |
HEAP_NO_SERIALIZE | RtlAllocateHeap がヒープにアクセスしている間は、相互除外は使用されません。 |
HEAP_ZERO_MEMORY | 割り当てられたメモリは 0 に初期化されます。 それ以外の場合、メモリは 0 に初期化されません。 |
[in] Size
割り当てられるバイト数。 HeapHandle パラメーターで指定されたヒープが拡張不可能なヒープの場合、Size はヒープの仮想メモリしきい値以下である必要があります。 (詳細については、Parameters パラメーターの VirtualMemoryThreshold メンバーを RtlCreateHeap に参照してください)。
戻り値
RtlAllocateHeap の呼び出しが成功した場合、戻り値は新しく割り当てられたブロックへのポインターです。 割り当てが失敗した場合、戻り値は NULL です。
注釈
RtlAllocateHeap は、指定したヒープから、指定したサイズのメモリ ブロックを割り当てます。
RtlAllocateHeap によって割り当てられたメモリ ブロックを解放するには、RtlFreeHeap を呼び出します。
RtlAllocateHeap によって割り当てられたメモリは移動できません。 メモリは移動できないため、ヒープが断片化する可能性があります。
シリアル化により、2 つ以上のスレッドが同じヒープからブロックを同時に割り当てたり解放したりしようとすると、相互の除外が保証されます。 シリアル化にはパフォーマンス コストは小さくなりますが、複数のスレッドが同じヒープからメモリを割り当てて解放するたびに使用する必要があります。 HEAP_NO_SERIALIZE値を設定すると、ヒープでの相互除外がなくなります。 シリアル化を行わないと、同じヒープ ハンドルを使用する 2 つ以上のスレッドが同時にメモリの割り当てまたは解放を試み、ヒープが破損する可能性があります。 したがって、HEAP_NO_SERIALIZE値は、次の状況でのみ安全に使用できます。
プロセスに含まれるスレッドは 1 つだけです。
プロセスには複数のスレッドがありますが、特定のヒープに対してヒープ関数を呼び出すスレッドは 1 つだけです。
このプロセスには複数のスレッドがあり、アプリケーションには特定のヒープへの相互除外のための独自のメカニズムが用意されています。
注意
アクセス違反から保護するには、構造化例外処理を使用して、ヒープへの書き込みまたはヒープからの読み取りを行うコードを保護します。 メモリ アクセスを使用した構造化例外処理の詳細については、「例外の 処理」を参照してください。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows XP |
対象プラットフォーム | ユニバーサル |
Header | ntifs.h (Ntifs.h を含む) |
Library | NtosKrnl.lib |
[DLL] | NtosKrnl.exe |
IRQL | < DISPATCH_LEVEL |