原文链接 -> 传送门
函数功能:
HeapFree 函数用于释放由 HeapAlloc 函数或 HeapReAlloc 函数分配的堆内存块。
API 函数原型:
注释:_In_ 说明该参数是输入的。
BOOL WINAPI HeapFree( _In_ HANDLE hHeap, _In_ DWORD dwFlags, _In_ LPVOID lpMem );
参数解析:
|
参数 |
含义 |
||||
|
hHeap |
1. 指向被释放的内存块的堆句柄 |
||||
|
dwFlags |
1. 堆内存释放选项
|
||||
|
lpMem |
1. 指向被释放的内存块的指针 |
返回值:
1. 如果函数调用成功,返回值是非 0;
2. 如果函数调用失败,返回值是 0。
若想获得更多的错误信息,可调用 GetLastError 函数。
备注:
1. 你不应该以任何方式引用被 HeapFree 函数释放的内存。在内存被释放之后,存储的信息可能已经永远的消失了。如果你需要使用该信息,不要释放包含信息的内存。返回该内存信息函数调用(例如 HeapSize 函数)不应该用于被释放的内存上,因为他们可能返回假的数据。两次调用 HeapFree 函数传入同一个指针会引起堆溢出,导致随后调用 HeapAlloc 函数返回该指针两次。
2. 当两个或多个线程尝试同时地分配或释放相同堆的内存块时,序列化可以确保互斥。序列化会有些许的性能损耗,但无论何时多个线程分配和释放相同堆的内存块都必须使用。使用 HEAP_NO_SERIALIZE 参数值消除堆中互斥。如果没有序列化,两个或者多个使用相同堆句柄的线程或许尝试同时地分配或释放内存,这可能会引起堆溢出。因此,HEAP_NO_SERIALIZE 参数值在下列情况是安全的:
· 进程只有一个线程。
· 进程有多个线程,但一个堆中只有一个线程在使用。
· 进程有多个线程,但应用程序使用堆时,有互斥解决方案。
需求:
|
Minimum supported client |
Windows xp [桌面应用程序 | Windows Store 程序] |
|
Minimum supported server |
Windows 2003 服务器版 [桌面应用程序 | Windows Store 程序] |
|
Minimum supported phone |
Windows Phone 8 |
|
Header |
HeapApi.h (包含于 Windows.h); |
|
Library |
Kernel32.lib |
|
DLL |
Kernel32.dll |




