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

HeapAlloc

点击次数:1440 更新时间:2017-6-19 19:20:08  【打印此页

原文链接 -> 传送门

函数功能:

HeapAlloc 函数用于分配堆内存的一个块。分配后的内存不可移动。


API 函数原型:

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

LPVOID WINAPI HeapAlloc(
  _In_ HANDLE hHeap,
  _In_ DWORD  dwFlags,
  _In_ SIZE_T dwBytes
);



参数解析:
 

参数

含义

hHeap

1. 指向将要被分配的堆内存句柄

2. 该句柄由 HeapCreate 函数或者 GetProcessHeap 函数获得

dwFlags

1. 堆内存分配选项

2. 如果使用 HeapCreate 函数创建堆,这些值将会覆盖之前对应的值

3. 该参数可以为以下的一个或多个:

含义

HEAP_GENERATE_EXCEPTIONS
(0x00000004)

1. 系统抛出异常表明函数调用失败,比如内存溢出时抛出异常,如果抛出异常就不返回 NULL

2. 应该在 HeapCreate 函数创建堆时指定 HEAP_GENERATE_EXCEPTIONS 参数值,以确保在调用 HeapAlloc 函数发生错误时抛出异常。如果 HeapCreate 函数指定了 HEAP_GENERATE_EXCEPTIONS,那么 HeapAlloc 函数中没有必要再指定 HEAP_GENERATE_EXCEPTIONS

HEAP_NO_SERIALIZE
(0x00000001)

1. 该参数分配的内存不使用序列化访问。更多信息,参见备注

2. 应该在 HeapCreate 函数创建堆时指定 HEAP_NO_SERIALIZE 参数值,以确保在调用 HeapAlloc 函数分配内存不能序列化访问。如果 HeapCreate 函数指定了 HEAP_NO_SERIALIZE,那么 HeapAlloc 函数中没有必要再指定 HEAP_NO_SERIALIZE

3. 当分配进程默认堆内存时,不应该使用此参数值。系统可能会在程序的进程中创建额外的线程,例如一个复制的句柄,它们会同时访问进程的默认堆

HEAP_ZERO_MEMORY
(0x00000008)

分配的内存被初始化为 0。其他参数值,内存不初始化为 0

dwBytes

1. 分配的内存字节数

2. 如果 hHeap 指向一个不增长堆,dwBytes 必须小于 0x7FFF8。您可以使用 HeapCreate 函数指定一个非 0 值创建不增长堆



返回值:

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);
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安装调试,服务器维护,数据恢复,密码破解,网络布线,网络检修,打印机维修,打印机加碳粉,苹果电脑安装系统,苹果电脑安装双系统,监控安装维护,电脑外包,笔记本电脑维修,餐饮、美容行业软件安装 等。。。。。。
点击次数:1440 更新时间:2017-6-19 19:20:08  【打印此页

上一条:GlobalAlloc

下一条:MAKEPOINTS 宏

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