RtlAllocateHeap 函式 (ntifs)

RtlAllocateHeap 常式會從堆積配置記憶體區塊。

語法

NTSYSAPI PVOID RtlAllocateHeap(
  [in]           PVOID  HeapHandle,
  [in, optional] ULONG  Flags,
  [in]           SIZE_T Size
);

參數

[in] HeapHandle

將配置記憶體之私用堆積的控制碼。 此參數是從成功呼叫 RtlCreateHeap 傳回的控制碼。

[in, optional] Flags

控制堆積配置的層面。 指定任何值,將會覆寫以 RtlCreateHeap 建立堆積時所指定的對應值。 這個參數可以是下列一或多個值。

旗標 意義
HEAP_GENERATE_EXCEPTIONS 系統會引發例外狀況以表示函式失敗,例如記憶體不足的狀況,而不是傳回 Null
HEAP_NO_SERIALIZE RtlAllocateHeap 正在存取堆積時,不會使用相互排除。
HEAP_ZERO_MEMORY 配置的記憶體將會初始化為零。 否則,記憶體不會初始化為零。

[in] Size

要配置的位元組數目。 如果堆積(由 HeapHandle 參數指定)是 nongrowable 堆積,則 大小 必須小於或等於堆積的虛擬記憶體閾值。 (需詳細資訊,請參閱 RtlCreateHeapParameters 參數 VirtualMemoryThreshold 成員 ) 。

傳回值

如果 RtlAllocateHeap 的呼叫成功,傳回值就是新配置之區塊的指標。 如果配置失敗,則傳回值為 Null。

備註

RtlAllocateHeap 會從指定的堆積配置指定大小的記憶體區塊。

若要釋放 RtlAllocateHeap 所配置的記憶體區塊,請呼叫 RtlFreeHeap

RtlAllocateHeap 配置的記憶體不是可移動的。 因為記憶體不是可移動的,所以堆積可能會被分割。

當兩個或多個執行緒嘗試同時從相同堆積配置或釋放區塊時,序列化可確保互斥。 序列化的效能成本很低,但每當有多個執行緒從相同堆積配置和釋放記憶體時,就必須使用它。 設定 HEAP_NO_SERIALIZE 值可排除堆積上的互斥。 若沒有序列化,使用相同堆積控制碼的兩個或多個執行緒可能會同時嘗試配置或釋放記憶體,可能會導致堆積損毀。 因此,只有在下列情況下,才可以安全地使用 HEAP_NO_SERIALIZE 值:

  • 進程只有一個執行緒。

  • 此程式有多個執行緒,但只有一個執行緒會針對特定堆積呼叫堆積函數。

  • 此程式有多個執行緒,而應用程式會提供它自己的機制,以相互排除特定的堆積。

注意

若要防止存取違規,請使用結構化例外狀況處理來保護任何寫入或讀取堆積的程式碼。 如需有關記憶體存取的結構化例外狀況處理的詳細資訊,請參閱 處理例外狀況。

規格需求

   
最低支援的用戶端 此常式可在 Microsoft Windows XP 及更新版本上取得。
目標平台 通用
標頭 ntifs (包含 Ntifs)
程式庫 Ntoskrnl.exe .lib
DLL NtosKrnl.exe
IRQL < DISPATCH_LEVEL

另請參閱

RtlCreateHeap

RtlDestroyHeap

RtlFreeHeap