堆函数
每个进程都有系统提供的默认堆。 通过堆进行频繁分配的应用程序可以使用专用堆来提高性能。
专用堆是调用进程的地址空间中的一个或多个页面块。 创建专用堆后,进程使用 HeapAlloc 和 HeapFree 等函数来管理该堆中的内存。
堆函数还可用于使用 GetProcessHeap 函数返回的句柄来管理进程的默认堆中的内存。 新应用程序应使用此堆函数,而不是 全局函数和本地函数。
使用其他内存分配函数分配的内存与从专用堆分配的内存之间没有区别。 有关函数的完整列表,请参阅 内存管理功能中的表。
注意
线程应仅对线程创建和管理的进程的默认堆和专用堆调用堆函数,使用 GetProcessHeap 返回的句柄或 HeapCreate 函数。
HeapCreate 函数创建一个专用堆对象,调用进程可以使用 HeapAlloc 函数分配内存块。 HeapCreate 指定堆的初始大小和最大大小。 初始大小确定最初为堆分配的已提交读/写页数。 最大大小确定保留页的总数。 这些页面在堆可以增长到的进程虚拟地址空间中创建连续块。 如果通过 HeapAlloc 的请求超出了已提交页面的当前大小(假设其可用的物理存储),则会自动从此保留空间提交其他页面。 提交页面后,在终止进程或通过调用 HeapDestroy 函数销毁堆之前,它们才会解除提交。
专用堆对象的内存只能访问创建它的进程。 如果动态链接库 (DLL) 创建专用堆,则会在调用 DLL 的进程地址空间中执行此作。 它只能访问该进程。
HeapAlloc 函数从专用堆分配指定的字节数,并返回指向已分配块的指针。 此指针可用于 HeapFree、HeapReAlloc、堆和 HeapValidate 函数。
由 HeapAlloc 分配的内存不可移动。 HeapAlloc 返回的地址有效,直到释放或重新分配内存块;内存块不需要锁定。
由于系统无法压缩专用堆,因此可能会碎片化。 在各种分配大小中分配大量内存的应用程序可以使用 低碎片堆 来减少堆碎片。
堆函数的可能用途是在进程启动时创建专用堆,并指定足以满足进程的内存要求的初始大小。 如果调用 HeapCreate 函数失败,进程可以终止或通知用户内存不足;但是,如果成功,则确保进程具有所需的内存。
HeapCreate 请求的内存可能是连续的,也可能不是连续的。 HeapAlloc 在堆中分配的内存是连续的。 不应在堆中的内存中写入或读取内存,除非由 HeapAlloc分配,也不应假定由 HeapAlloc分配的两个内存区域之间存在任何关系。
不应以任何方式引用已由 HeapFree释放的内存。 释放内存后,可能已在其中的任何信息将永远消失。 如果需要信息,请不要释放包含信息的内存。 返回有关内存信息的函数调用(如 HeapSize)可能不会与释放的内存一起使用,因为它们可能会返回虚假数据。
HeapDestroy 函数销毁专用堆对象。 它会取消提交并释放堆对象的所有页面,并使堆的句柄失效。
相关主题