heapValidate 函数 (heapapi.h)

验证指定的堆。 函数扫描堆中的所有内存块,并验证堆管理器维护的堆控制结构是否处于一致状态。 还可以使用 HeapValidate 函数来验证指定堆中的单个内存块,而无需检查整个堆的有效性。

语法

BOOL HeapValidate(
  [in]           HANDLE  hHeap,
  [in]           DWORD   dwFlags,
  [in, optional] LPCVOID lpMem
);

参数

[in] hHeap

要验证的堆的句柄。 此句柄由 HeapCreateGetProcessHeap 函数返回。

[in] dwFlags

堆访问选项。 此参数可以是以下值。

含义
HEAP_NO_SERIALIZE
0x00000001
不会使用序列化访问。 有关详细信息,请参阅“备注”。

若要确保对此函数的所有调用禁用序列化访问,请在对 HeapCreate 的调用中指定HEAP_NO_SERIALIZE。 在这种情况下,无需在此函数调用中额外指定 HEAP_NO_SERIALIZE

访问进程默认堆时,不应指定此值。 系统可能会在应用程序的进程中创建其他线程,例如同时访问进程默认堆的 CTRL+C 处理程序。

[in, optional] lpMem

指向指定堆中的内存块的指针。 此参数可以为 NULL

如果此参数为 NULL,则该函数将尝试验证 hHeap 指定的整个堆。

如果此参数不为 NULL,则该函数将尝试验证 lpMem 指向的内存块。 它不会尝试验证堆的其余部分。

返回值

如果指定的堆或内存块有效,则返回值为非零值。

如果指定的堆或内存块无效,则返回值为零。 在设置为调试的系统上, HeapValidate 函数随后显示调试消息,这些消息描述堆或内存块的无效部分,并在硬编码断点处停止,以便你可以检查系统以确定无效性的来源。 HeapValidate 函数不设置线程的最后一个错误值。 此函数没有扩展的错误信息;不要调用 GetLastError

注解

HeapValidate 函数主要用于调试,因为验证可能很耗时。 验证堆可能会阻止其他线程访问堆并降低性能,尤其是在对称多处理 (SMP) 计算机上。 这些副作用可能会持续到 HeapValidate 返回为止。

堆中的每个内存块以及整个堆都有堆控制结构。 使用 HeapValidate 函数验证完整的堆时,它会检查所有这些控制结构的一致性。

使用 HeapValidate 验证堆中的单个内存块时,它仅检查与该元素相关的控制结构。 HeapValidate 只能验证分配的内存块。 对释放的内存块调用 HeapValidate 将返回 FALSE ,因为没有要验证的控制结构。

如果要验证 HeapWalk 函数枚举的堆元素,则只应对在 PROCESS_HEAP_ENTRY 结构的 wFlags 成员中具有PROCESS_HEAP_ENTRY_BUSY的元素调用 HeapValidate 对于未设置此位的所有堆元素,HeapValidate 返回 FALSE

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

  • 进程只有一个线程。
  • 进程有多个线程,但只有一个线程调用特定堆的堆函数。
  • 进程具有多个线程,应用程序为特定堆提供自身的相互排斥机制。

要求

要求
最低受支持的客户端 Windows XP [仅限桌面应用]
最低受支持的服务器 Windows Server 2003 [仅限桌面应用]
目标平台 Windows
标头 heapapi.h (包括 Windows.h)
Library Kernel32.lib
DLL Kernel32.dll

另请参阅

堆函数

HeapCreate

HeapWalk

内存管理函数

PROCESS_HEAP_ENTRY