原文链接 -> 传送门
函数功能:
HeapCreate 函数用于创建可以由进程调用的私有堆对象。该函数在进程的虚拟地址空间预留空间,且为这个内存块指定的初始部分分配物理存储。
API 函数原型:
注释:_In_ 说明该参数是输入的。
HANDLE WINAPI HeapCreate( _In_ DWORD flOptions, _In_ SIZE_T dwInitialSize, _In_ SIZE_T dwMaximumSize );
参数解析:
|
参数 |
含义 |
||||||||
|
flOptions |
1. 指定堆分配选项,这些选项影响随后的通过调用堆内存管理函数访问的新堆
|
||||||||
|
dwInitialSize |
1. 堆的初始大小,字节单位。该值决定堆初始提交的内存量大小,向前取整为系统页面大小的整数倍,但必须小于 dwMaximumSize |
||||||||
|
dwMaximumSize |
1. 堆的最大大小,字节单位。HeapCreate 函数把 dwMaximumSize 向前到多个系统的页面大小,然后为堆在进程的虚拟地址空间预留 dwMaximumSize 大小的内存块区域。如果由HeapAlloc 函数或 HeapReAlloc 函数请求分配的内存超过 dwInitialSize 指定的大小,系统提交额外的内存页面,但不超过堆的最大大小 |
返回值:
1. 如果函数调用成功,返回值是指向新创建的堆句柄;
2. 如果函数调用失败,返回值是 NULL。
若想获得更多的错误信息,可调用 GetLastError 函数。
备注:
1. HeapCreate 函数从调用进程通过使用 HeapAlloc 函数分配的内存块创建一个私有堆对象。初始大小确定最初从堆分配提交页面的数量。最大值决定预留页面的总数。这些页面在进程的虚拟地址空间中创建堆可以增长的内存块。如果 HeapAlloc 函数请求超过当前提交页大小,当物理存储足够,额外的页面会从这个预留的空间自动提交。
2. Windows Server 2003 和 Windows XP:默认情况下,新创建的私有堆是一个标准堆。要启用堆低碎片,使用该私有堆句柄做为参数调用 HeapSetInformation 函数。
3. 私有堆对象的内存访问仅限于创建它的进程。如果一个动态链接库(DLL)创建一个私有堆,则创建堆在调用动态链接库进程的地址空间中,堆对象的内存访问仅限于该进程。
4. 系统使用私人堆内存以存储堆支撑结构,所以对进程来说,不是所有指定的堆大小都是可用的。例如,如果 HeapAlloc函数从一个最大大小为 64 K 堆请求分配 64 K ,因为系统开销请求可能会失败。
5. 如果没有指定 HEAP_NO_SERIALIZE (默认),调用进程的堆默认以串行访问。当两个或两个以上的线程试图同时从相同堆分配或释放内存块,序列化确保互斥。序列化有小的性能损耗,但多个线程从相同堆分配和释放内存时,它必须使用。HeapLock 函数和 HeapUnlock 函数可以用来阻止和允许访问序列化堆。
6. 设置 HEAP_NO_SERIALIZE 值在堆上消除互斥。如果没有序列化,使用相同堆句柄的两个或两个以上的线程可能会试图同时分配或释放内存,这可能会导致堆溢出。因此,HEAP_NO_SERIALIZE 值可以仅在以下情况安全地使用:
· 进程只有一个线程
· 进程有多个线程,但一个堆中只有一个线程在使用
· 进程有多个线程,但应用程序使用堆时,有互斥解决方案
7. 在以 HEAP_NO_SERIALIZE 值创建的堆中调用 HeapLock 和 HeapUnlock 函数,结果未定义。
8. 使用 GetProcessHeap 函数获取进程的默认堆句柄。使用 GetProcessHeaps 函数,获取调用进程默认堆和活动私有堆句柄。
需求:
|
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 |




