HeapSize 函数 (heapapi.h)

检索由 HeapAlloc 或 HeapReAlloc 函数从堆分配的内存块的大小。

语法

SIZE_T HeapSize(
  [in] HANDLE  hHeap,
  [in] DWORD   dwFlags,
  [in] LPCVOID lpMem
);

参数

[in] hHeap

内存块所在的堆的句柄。 此句柄由 HeapCreateGetProcessHeap 函数返回。

[in] dwFlags

堆大小选项。 使用 HeapCreate 函数创建堆时,指定以下值将替代 flOptions 参数中指定的相应值。

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

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

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

[in] lpMem

指向函数将获取其大小的内存块的指针。 这是 由 HeapAlloc 或 HeapReAlloc 函数返回 指针。 内存块必须来自 hHeap 参数指定的堆。

返回值

如果函数成功,则返回值是请求的已分配内存块的大小(以字节为单位)。

如果该函数失败,则返回值为 (SIZE_T)-1。 函数不调用 SetLastError。 应用程序无法调用 GetLastError 以获取扩展错误信息。

如果 lpMem 参数引用的堆分配不在 hHeap 参数指定的堆中,则 HeapSize 函数的行为未定义。

注解

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

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

要求

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

另请参阅

堆函数

HeapAlloc

HeapReAlloc

内存管理函数

VBS enclave 中可用的 Vertdll API