原文链接 -> 传送门
函数功能:
HeapAlloc 函数用于分配堆内存的一个块。分配后的内存不可移动。
API 函数原型:
注释:_In_ 说明该参数是输入的。
LPVOID WINAPI HeapAlloc( _In_ HANDLE hHeap, _In_ DWORD dwFlags, _In_ SIZE_T dwBytes );
参数解析:
|
参数 |
含义 |
||||||||
|
hHeap |
1. 指向将要被分配的堆内存句柄 |
||||||||
|
dwFlags |
1. 堆内存分配选项
|
||||||||
|
dwBytes |
1. 分配的内存字节数 |
返回值:
1. 如果函数调用成功,返回值为一个指向所分配内存块的首地址指针;
2. 如果函数调用失败,不指定 HEAP_GENERATE_EXCEPTIONS,则返回 NULL。
3. 如果函数调用失败,且指定 HEAP_GENERATE_EXCEPTIONS,函数会生成下列两个异常之一。异常取决于堆溢出性质。若想获取更多信息,查阅 GetExceptionCode 宏。
|
异常代码 |
描述 |
|
STATUS_NO_MEMORY |
由于缺少可用内存或者是堆溢出导致分配失败 |
|
STATUS_ACCESS_VIOLATION |
由于堆溢出或者函数参数不正确导致分配失败 |
如果先前没有调用 SetLastError 函数,那么当 HeapAlloc 函数调用失败时,应用程序无法通过调用 GetLastError 函数获取更多错误信息。
备注:
1. 如果函数调用成功,至少会分配用户请求的内存大小。
2. 使用由 GetProcessHeap 函数返回的句柄,分配进程默认堆内存。
3. 使用 HeapFree 函数释放内存。
4. HeapAlloc 函数分配的内存是不可移动的。在内存块被释放或者重新分配前,由 HeapAlloc 函数返回的地址是有效的;该内存块不需要锁定。因为系统不能聚集私有堆,所以堆内存碎片化。
5. 当应用程序分配大量不同大小内存时,应该使用低碎片化堆,以减少堆碎片化。
6. 当两个或者多个线程尝试同时分配或者释放相同堆的内存块。这对序列化存在小小的影响,但是它必须被使用无论何时多个线程分配或者释放相同堆的内存块。使用 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 |




