捐助郴维网
感谢您对郴维网的支持,你的支持将是郴维网持续发展的动力!
二维码
×
当前位置:郴维网 >API档案 > 正文
17 2017.06

HeapCreate

点击次数:1316 更新时间:2017-6-17 20:26:11  【打印此页

原文链接 -> 传送门

函数功能:

HeapCreate 函数用于创建可以由进程调用的私有堆对象。该函数在进程的虚拟地址空间预留空间,且为这个内存块指定的初始部分分配物理存储。


API 函数原型:

注释:_In_ 说明该参数是输入的。

HANDLE WINAPI HeapCreate(
  _In_ DWORD  flOptions,
  _In_ SIZE_T dwInitialSize,
  _In_ SIZE_T dwMaximumSize
);


参数解析:
 

参数

含义

flOptions

1. 指定堆分配选项,这些选项影响随后的通过调用堆内存管理函数访问的新堆

2. 这个参数可以是 0 或下表的一个或多个值:

含义

HEAP_CREATE_ENABLE_EXECUTE
(0x00040000)

如果硬件实施数据执行保护,那么所有从堆分配的内存块都允许代码执行。在堆中执行代码的应用程序使用这个堆标志。如果没有指定 HEAP_CREATE_ENABLE_EXECUTE 且应用程序试图从一个受保护的页面运行代码,应用程序则接收到一个异常状态码 STATUS_ACCESS_VIOLATION

HEAP_GENERATE_EXCEPTIONS
(0x00000004)

调用 HeapAlloc 函数和 HeapReAlloc 函数系统抛出异常指示失败(例如,内存溢出情况)而不是返回 NULL

HEAP_NO_SERIALIZE
(0x00000001)

1. 当堆内存管理函数访问这个堆,串行访问不使用。这个选项适用于后续所有的堆函数调用。此外,您可以指定这个选项在个人堆函数调用上

2. 使用这个选项创建的堆不能开启堆低碎片化

3. 使用这个选项创建的堆不能锁定

4. 关于串行访问的更多信息,请参见备注部分

dwInitialSize

1. 堆的初始大小,字节单位。该值决定堆初始提交的内存量大小,向前取整为系统页面大小的整数倍,但必须小于 dwMaximumSize

2. 如果这个参数是 0,这个函数提交一页。使用 GetSystemInfo 函数获取主机电脑的页面大小

dwMaximumSize

1. 堆的最大大小,字节单位。HeapCreate 函数把 dwMaximumSize 向前到多个系统的页面大小,然后为堆在进程的虚拟地址空间预留 dwMaximumSize 大小的内存块区域。如果由HeapAlloc 函数或 HeapReAlloc 函数请求分配的内存超过 dwInitialSize 指定的大小,系统提交额外的内存页面,但不超过堆的最大大小

2. 如果 dwMaximumSize 不是 0,堆大小是固定的且不超出最大值。同时,对于 32 位进程来说,可以从堆中分配的最大的内存块略小于 512 KB ,64 位的进程略小于 1024 KB 。请求分配数量较多的内存块会失败,即使堆的最大值足够容纳这些内存块

3. 如果 dwMaximumSize 为 0,堆可以按一定大小增长。堆的大小为可用内存。请求分配的内存超过堆固定大小限制不自动失败,取而代之的是,系统调用 VirtualAlloc 函数获取所需的大量内存。应用程序需要分配大量的内存块应该设置 dwMaximumSize 为 0



返回值:

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);
WinBase.h 在 Windows Server 2008 R2, Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003, and Windows XP 上(包含于 Windows.h)

Library

Kernel32.lib

DLL

Kernel32.dll

 

提示
郴维网为您提供各类专业服务:
软件开发,电脑配件销售,WIFI路由器销售,上门电脑维修,上门安装系统,系统安装,软、硬件安装,电脑除尘清灰,显示器维修,WIFI安装调试,服务器维护,数据恢复,密码破解,网络布线,网络检修,打印机维修,打印机加碳粉,苹果电脑安装系统,苹果电脑安装双系统,监控安装维护,电脑外包,笔记本电脑维修,餐饮、美容行业软件安装 等。。。。。。
点击次数:1316 更新时间:2017-6-17 20:26:11  【打印此页

上一条:LocalFree

下一条:GetProcessHeap

关键词推荐:郴州电脑城 郴州电脑维修公司 维修电脑公司 郴州软件开发 上门电脑维修 上门安装系统 笔记本电脑维修 郴州打印机维修 打印机加碳粉 电脑安装双系统 苹果电脑双系统 液晶显示器维修 联想笔记本维修 联想笔记本维修电话 戴尔笔记本维修电话 郴州戴尔笔记本维修 戴尔笔记本郴州维修点 华硕笔记本维修点 郴州华硕笔记本维修 郴州笔记本上网维修