HeapCompact 函数 (heapapi.h)
返回指定堆中最大提交的可用块的大小。 如果已设置 “在免费 全局标志上禁用堆合并”,则此函数还会合并堆中相邻的可用内存块。
语法
SIZE_T HeapCompact(
[in] HANDLE hHeap,
[in] DWORD dwFlags
);
参数
[in] hHeap
堆的句柄。 此句柄由 HeapCreate 或 GetProcessHeap 函数返回。
[in] dwFlags
堆访问选项。 此参数可以是以下值。
返回值
如果函数成功,则返回值是堆中提交的最大可用块的大小(以字节为单位)。
如果函数失败,则返回值为零。 若要获取扩展的错误信息,请调用 GetLastError。
在堆中绝对没有可用空间的情况下,函数返回值为零,GetLastError 返回值NO_ERROR。
言论
HeapCompact 函数主要用于调试。 通常,每当调用 HeapFree 函数时,系统会压缩堆,HeapCompact 函数将返回堆中最大可用块的大小,但不进一步压缩堆。 如果在调试期间设置了免费 全局标志上的
不能保证应用程序可以成功分配由 HeapCompact返回大小的内存块。 其他线程或提交阈值可能会阻止此类分配。
当两个或多个线程尝试同时分配或释放同一堆中的块时,序列化可确保相互排斥。 序列化的性能成本很小,但每当多个线程从同一堆中分配和释放内存时,都必须使用它。 设置 HEAP_NO_SERIALIZE 值可消除堆上的相互排斥。 如果没有序列化,使用同一堆句柄的两个或多个线程可能会同时尝试分配或释放内存,这可能会导致堆损坏。 因此,HEAP_NO_SERIALIZE 值只能在以下情况下安全地使用:
- 进程只有一个线程。
- 进程有多个线程,但只有一个线程调用特定堆的堆函数。
- 进程具有多个线程,并且应用程序提供自己的机制来相互排除到特定堆。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows XP [桌面应用 |UWP 应用] |
支持的最低服务器 | Windows Server 2003 [桌面应用 |UWP 应用] |
目标平台 | 窗户 |
标头 | heapapi.h (包括 Windows.h) |
库 | Kernel32.lib |
DLL | Kernel32.dll |
另请参阅
VBS enclave 中提供的 Vertdll API