堆函数

每个进程都有系统提供的默认堆。 频繁从堆进行分配的应用程序可以使用专用堆来提高性能。

专用堆是调用进程的地址空间中一个或多个页面的块。 创建专用堆后,进程使用 HeapAllocHeapFree 等函数来管理该堆中的内存。

堆函数还可用于使用 GetProcessHeap 函数返回的句柄来管理进程默认堆中的内存。 为此,新应用程序应使用堆函数而不是 全局函数和本地函数

从专用堆分配的内存和使用其他内存分配函数分配的内存之间没有区别。 有关函数的完整列表,请参阅 内存管理函数中的表。

注意

线程应仅对进程的默认堆和线程创建和管理的专用堆调用堆函数,并使用 GetProcessHeapHeapCreate 函数返回的句柄。

 

HeapCreate 函数创建专用堆对象,调用进程可以使用 HeapAlloc 函数从中分配内存块。 HeapCreate 指定堆的初始大小和最大大小。 初始大小确定最初为堆分配的已提交、读/写页数。 最大大小确定保留页的总数。 这些页面在堆可以增长到的进程的虚拟地址空间中创建一个连续块。 如果 HeapAlloc 的请求超过已提交页面的当前大小(假设其物理存储可用),则会自动从此保留空间提交其他页面。 提交页面后,在进程终止或通过调用 HeapDestroy 函数销毁堆之前,它们不会解除提交。

专用堆对象的内存只能由创建它的进程访问。 如果动态链接库 (DLL) 创建专用堆,则会在调用 DLL 的进程地址空间中执行此操作。 它只能由该进程访问。

HeapAlloc 函数从专用堆分配指定数量的字节,并返回指向已分配块的指针。 此指针可用于 HeapFreeHeapReAllocHeapSizeHeapValidate 函数。

HeapAlloc 分配的内存不可移动。 HeapAlloc 返回的地址在释放或重新分配内存块之前有效;不需要锁定内存块。

由于系统无法压缩专用堆,因此它可能会变得碎片化。 以各种分配大小分配大量内存的应用程序可以使用 低碎片堆 来减少堆碎片。

堆函数的一个可能用途是在进程启动时创建专用堆,指定足以满足进程的内存要求的初始大小。 如果对 HeapCreate 函数的调用失败,进程可能会终止或通知用户内存不足;但是,如果成功,则确保进程具有所需的内存。

HeapCreate 请求的内存可以是连续的,也可能不是连续的。 堆中由 HeapAlloc 分配的内存是连续的。 不应写入堆中的内存或从堆中读取内存,除非由 HeapAlloc 分配的内存,也不应假定 HeapAlloc 分配的两个内存区域之间存在任何关系。

不应以任何方式引用已由 HeapFree 释放的内存。 释放内存后,内存中可能已存在的任何信息将永久消失。 如果需要信息,请不要释放包含该信息的内存。 返回有关内存 ((例如 HeapSize) )信息的函数调用可能不会与释放的内存一起使用,因为它们可能会返回虚假数据。

HeapDestroy 函数销毁专用堆对象。 它会取消提交和释放堆对象的所有页,并使堆的句柄失效。

比较内存分配方法