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 创建堆时指定的相应值。 此参数可使用以下一个或多个值。

标志 含义
HEAP_GENERATE_EXCEPTIONS 系统将引发异常以指示函数失败(例如内存不足情况),而不是返回 NULL
HEAP_NO_SERIALIZE RtlAllocateHeap 访问堆时,不会使用互斥。
HEAP_ZERO_MEMORY 分配的内存将初始化为零。 否则,内存不会初始化为零。

[in] Size

要分配的字节数。 如果 HeapHandle 参数指定的堆是不可增长的堆, 则大小 必须小于或等于堆的虚拟内存阈值。 (有关详细信息,请参阅 RtlCreateHeap.) 的 Parameters 参数的 VirtualMemoryThreshold 成员

返回值

如果对 RtlAllocateHeap 的调用成功,则返回值是指向新分配的块的指针。 如果分配失败,则返回值为 NULL。

注解

RtlAllocateHeap 从指定堆分配指定大小的内存块。

若要释放 RtlAllocateHeap 分配的内存块,请调用 RtlFreeHeap

RtlAllocateHeap 分配的内存不可移动。 由于内存不可移动,堆可能会碎片化。

当两个或多个线程尝试从同一堆同时分配或释放块时,序列化可确保相互排斥。 序列化的性能成本很小,但每当多个线程从同一个堆分配和释放内存时,必须使用它。 设置HEAP_NO_SERIALIZE值会消除堆上的相互排斥。 如果不进行序列化,使用同一堆句柄的两个或多个线程可能会尝试同时分配或释放内存,这可能会导致堆损坏。 因此,只能在以下情况下安全地使用HEAP_NO_SERIALIZE值:

  • 进程只有一个线程。

  • 进程有多个线程,但只有一个线程调用特定堆的堆函数。

  • 进程具有多个线程,应用程序提供自己的机制,用于对特定堆进行相互排斥。

注意

若要防止访问冲突,请使用结构化异常处理来保护写入堆或从堆读取的任何代码。 有关使用内存访问进行结构化异常处理的详细信息,请参阅 处理异常

要求

要求
最低受支持的客户端 Windows XP
目标平台 通用
标头 ntifs.h (包括 Ntifs.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL < DISPATCH_LEVEL

另请参阅

RtlCreateHeap

RtlDestroyHeap

RtlFreeHeap