HeapAlloc()

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

HeapAlloc

这个函数从一个堆里分配一块内存。分配得到的内存是不可移动的。


LPVOID HeapAlloc( HANDLE hHeap , DWORD dwFlags , DWORD dwBytes);

参数:

hHeap:堆句柄,从该堆分配内存。这个参数是函数 HeapCreate 或 GetProcessHeap 的返回值。

dwFlags:堆分配选项。这里指定的标记将会重写由 HeapCreate 创建堆时指定的标记。

下面给出该参数可以使用的值,你可以指定一个或多个标记。

HEAP_NO_SERIALIZE:可忽略。默认为堆是序列化的。

HEAP_ZERO_MEMERY:指明分配的内存将会被初始化为0 。若不指定内存将不会初始化。

dwBytes:分配的空间大小,单位为Byte。如果这个堆被指定是不可增长的,那么此参数需小于 0x7FFF8 。(PS :好奇怪的大小)

返回值:

成功:指向被分配的内存块的指针。

失败:NULL

如果这个函数失败,将不会调用 SetLastError 函数 。 应用程序不能调用 GetLastError 得到错误信息。

附注:

如果函数调用成功,分配的内存至少是dwBytes参数指定的大小。如果分配的内存较多,进程可以使用所分配的全部。可以使用 Heap 函数获得实际分配的内存块的大小。

使用 HeapFree 函数来释放该函数所分配的内存块。

该函数分配的内存块是不可移动的,由此,堆可能是碎片化的。

序列化确保当两个以上的线程同时从同一个堆里分配或者释放内存块时操作是互斥的。这会有一些系统开销,但当多线程同时操作一个堆的时候这是必须被使用的。

每个堆总有一个临界区从而使存取序列化。每个堆的临界区有保护存取的作用。

An attempt to grab a critical section that is not owned is a fast path operation that incurs little overhead.(企图占据一个不属于自己的临界区是一种有额外开销的快捷操作方法)。这类似于当永远只有一个线程操作一个特定的堆时对这个堆使用HEAP_NO_SERIALIZE标记。

If there is contention for the critical section and therefore the heap, a new thread request to allocate heap space will serialize.(若对临界区存在争执,则新线程分配堆空间的请求将序列化)

(PS:一个线程使用堆时占用临界区,离开时释放,而临界区同一时间只能被一个线程占用,其他线程占用临界区的请求将会被按序列挂起,虽然这样做会使程序有额外的开销——即被挂起的线程,但这样就能保证堆内数据的安全——多个线程不能同时操作堆)

要求:

系统版本:WinCE 1.0以上

头文件:Winbase.h

链接库:Coredll.lib


HeapAlloc内部算法 大家都知道在VC中使用new操作符时(如果没有重载的话),其内部实际上调用了标准的malloc,而根据工程设置中选择的运行库的不同(是否多线程,是否调试,是否Dll等)调用了不同的malloc版本,多线程版malloc内部使用了Win32的关键区,而调试版会额外多申请一些内存用来保存调试信息,这些直接看VC附带的crt源码就可以看到。所有版本的malloc的共同点是最后都调用了Win32的API函 阅读详情

相关推荐

侯捷 - C++ Startup 揭密:C++ 程序的生前和死后 (一)

前言:如何自定Startup code(CRT) 提问: C++进入点是main()吗? 什么代码比main()更早被执行? 什么代码在main()结束后才被执行? 为什么上述代码可以如此行为? Heap的结构如何? I/O的结构如何? 在windows环境下,使用VC6进行开发,我们写下以下代码(启动码函数): #include <windows.h> int M...

Jeff_的博客 2559

Windows API一日一练(78)HeapAlloc函数

前面已经介绍两个分配内存的函数,一个全局的内存分配,一个是私有的内存分配。在进程私有的内存里分配里,又有两种分配情况,一种上基于栈式的内存分配,另一种是基于堆内存的分配。在c++里使用堆内存分配是使用HeapAlloc函数来实现的,也就是实现new操作符分配内存时会调这个函数。 函数HeapAlloc声明如下: WINBASEAPI __bcount(dwBytes) LP...

anjichan4261的博客 611

Win32(File/Thread/HeapAlloc)等小例子

vs2013 上根据培训内容抄的Win32 API实现的windows环境下的文件读写/内存分配/线程同步等小实例。适合初学者学习和长时间很少接触Win32 API的开发者快速了解

详细介绍HeapAlloc()

书籍:《Visual C++ 2017从入门到精通》的2.9 内存管理环境:visual studio 2022内容:[例 2.51] 分配内存堆并释放是 Windows API 中用于从堆(Heap)中分配内存的核心函数,提供了比malloc()更灵活的内存管理能力。

felicity_one的博客 1104

C++ malloc()HeapAlloc()的区别

DECLSPEC_ALLOCATOR LPVOID HeapAlloc( HANDLE hHeap,//HeapCreate或GetProcessHeap DWORD dwFlags,//HeapCreate的标志 SIZE_T dwBytes//分配的内存大小 ); dwFlags 定义 HEAP_GENERATE_EXCEPTIONS 分配失败则抛出异常 H...

weixin_43692244的博客 1570

2014-03-13周四:内存释放函数HeapFree ()内存开辟函数HeapAlloc重新开辟函数HeapReAlloc

BOOL bResult=HeapFree(GetProcessHeap(),0,pMem);  成功时返回1,失败时返回0。

勿忘初心,安得始终 1610

GlobalAlloc函数和new()的区别

1. GlobalAlloc函数和new()的区别。       1>new是标准的C++分配内存函数。GlobalAlloc是WIN下的API函数。    2>new分配内存同时会调用类等对象的构造函数。GlobalAlloc不回。    3>new分配的内存只能同进程使用,如(A进程new,B进程不能delete),GlobalAlloc能多进程使用,并删除。   2. Gl

lianzhirong123的专栏 466

内存分配详解 malloc, new, HeapAlloc, VirtualAlloc,GlobalAlloc

  很多地方都会使用内存内存使用过程中操作不当就容易崩溃,无法运行程序,上网Google学习一下,了解整理下他们之间的区别以及使用 ,获益匪浅 0x01 各自的定义和理解    (1)先看GlobalAlloc()      GlobalAlloc()主要用于Win32应用程序实现从全局堆中分配出内存供2017-03-05程序使用,是16位WINDOWS程序使用的API,对应于系统的全局栈...

推理小孩的博客 481

内存分配(malloc,new,VirtualAlloc,HeapAlloc,GlobalAlloc,LocalAlloc)区别与注意

malloc()头文件:#include <malloc.h> 或 #include <alloc.h> (注意:alloc.h 与 malloc.h 的内容是完全一致的。)功能:分配长度为num_bytes字节的内存块说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。 C运行库中的动态内存分...

weixin_30611509的博客 504

VC内存分配:GlobalAlloc、new、malloc、HeapAlloc

VC编程精粹需要进行内存的动态分配和释放操作,本文总结常用的VC对内存的操作方法并比较他们之间的区别,以便于读者能够加深对他们的理解并根据项目的实际情况选用适合自己的方案。 用法总结: 1、GlobalAlloc() The GlobalAlloc function allocates the specified number of bytes from the heap. Wi

千里之外 905

1205 对icmp报文的构造

1205 对icmp报文的构造1,存储空间申请icmp_data =(char*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,MAX_PACKET);    2,初始化memset(icmp_data,0,MAX_PACKET); 3,构造报文       //重要函数,填充ICMP包头FillICMPData(i

ensungm的专栏 574

HeadAlloc , GetProcessHead , OpenHead ,

(1)GetProcessHead 用以获取和调用进程的堆句柄

bobopeng 927

详细介绍GlobalAlloc()和GlobalFree()

书籍:《Visual C++ 2017从入门到精通》的4.2 按钮控件环境:visual studio 2022内容:[例 4.2]制作图片按钮说明:以上内容大部分来自腾讯元宝。

felicity_one的博客 914

VS(Visual Studio)中检测内存泄露

最近写了一个从二进制文件中查找函数的库需要放到服务端,于是要解决内存泄露的问题,首先测试 添加头文件: #define CRTDBG_MAP_ALLOC #include <crtdbg.h> 在 mian 函数结尾使用 _CrtDumpMemoryLeaks(); 测试程序: #include <stdlib.h> #define CRTDBG_MAP_ALLOC #include <crtdbg.h> int main() { char *a =

Tiantangbujimo7的博客 2201

HeapAlloc函数

前面已经介绍两个分配内存的函数,一个全局的内存分配,一个是私有的内存分配。在进程私有的内存里分配里,又有两种分配情况,一种上基于栈式的内存分配,另一种是基于堆内存的分配。在c++里使用堆内存分配是使用HeapAlloc函数来实现的,也就是实现new操作符分配内存时会调这个函数。   函数HeapAlloc声明如下: WINBASEAPI __bcount(dwBytes) LPVOID

芝麻软件工作室的专栏 451

C++内存报错汇总

* 0xABABABAB : Used by Microsoft's HeapAlloc() to mark "no man's land" guard bytes after allocated heap memory * 0xABADCAFE : A startup to this value to initialize all free memory to catch errant pointers * 0xBAADF00D : Used by Microsoft's LocalAlloc(LME

Hans的博客 513

Windows API 学习笔记

//test thread #include <windows.h> #include <stdio.h> #define MAX_NUM 5 typedef struct TEST_STRUCT// { DWORD i; DWORD dwRandom; }TEST_STRUCT,*TEST_PTR; DWORD WINA...

dasaisao0725的博客 167
上一篇: GetProcessHeap()
下一篇: HeapCreate()
windroid
博客等级 码龄12年 28粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值