heapFree 函数 (heapapi.h)
释放由 HeapAlloc 或 HeapReAlloc 函数从堆分配的内存块。
语法
BOOL HeapFree(
[in] HANDLE hHeap,
[in] DWORD dwFlags,
[in] _Frees_ptr_opt_ LPVOID lpMem
);
参数
[in] hHeap
要释放其内存块的堆的句柄。 此句柄由 HeapCreate 或 GetProcessHeap 函数返回。
[in] dwFlags
堆免费选项。 使用 HeapCreate 函数创建堆时,指定以下值将替代 flOptions 参数中指定的相应值。
值 | 含义 |
---|---|
|
不会使用序列化访问。 有关详细信息,请参阅“备注”。
若要确保对此函数的所有调用禁用序列化访问,请在对 HeapCreate 的调用中指定HEAP_NO_SERIALIZE。 在这种情况下,无需在此函数调用中额外指定 HEAP_NO_SERIALIZE 。 访问进程堆时不要指定此值。 系统可能会在应用程序的进程中创建其他线程,例如同时访问进程堆的 CTRL+C 处理程序。 |
[in] lpMem
指向要释放的内存的指针。 此指针由 HeapAlloc 或 HeapReAlloc 函数返回。 此指针可以为 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 |