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 参数指定的堆是不可增长的堆,大小 必须小于或等于堆的虚拟内存阈值。 (有关详细信息,请参阅 Parameters 参数的 VirtualMemoryThreshold 成员,RtlCreateHeap

返回值

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

言论

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

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

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

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

  • 进程只有一个线程。

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

  • 进程具有多个线程,并且应用程序提供自己的机制来相互排除到特定堆。

注意

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

要求

要求 价值
最低支持的客户端 Windows XP
目标平台 普遍
标头 ntifs.h (include Ntifs.h)
NtosKrnl.lib
DLL NtosKrnl.exe
IRQL < DISPATCH_LEVEL

另请参阅

RtlCreateHeap

RtlDestroyHeap

RtlFreeHeap