heapFree 函数 (heapapi.h)

释放由 HeapAlloc 或 HeapReAlloc 函数从堆分配的内存块。

语法

BOOL HeapFree(
  [in] HANDLE                 hHeap,
  [in] DWORD                  dwFlags,
  [in] _Frees_ptr_opt_ LPVOID lpMem
);

参数

[in] hHeap

要释放其内存块的堆的句柄。 此句柄由 HeapCreateGetProcessHeap 函数返回。

[in] dwFlags

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

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

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

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

[in] lpMem

指向要释放的内存的指针。 此指针由 HeapAllocHeapReAlloc 函数返回。 此指针可以为 NULL

返回值

如果该函数成功,则返回值为非零值。

如果函数失败,则返回值为零。 应用程序可以调用 GetLastError 以获取扩展错误信息。

注解

不应以任何方式引用已由 HeapFree 释放的内存。 释放该内存后,可能已存在的任何信息将永远消失。 如果需要信息,请不要释放包含该信息的内存。 返回有关内存 ((例如 HeapSize) )信息的函数调用可能不会与释放的内存一起使用,因为它们可能会返回虚假数据。 使用同一指针调用 HeapFree 两次可能会导致堆损坏,导致对 HeapAlloc 的后续调用返回同一指针两次。

当两个或多个线程尝试从同一堆同时分配或释放块时,序列化可确保相互排斥。 序列化的性能成本很小,但每当多个线程从同一堆分配和释放内存时,必须使用它。 设置 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