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 |