windows 核心编程之18 堆

本文深入探讨了堆内存的概念,包括默认堆及其用途、额外堆的创建原因、创建与管理堆内存的方法、以及与其他堆函数的交互。重点介绍了如何合理使用堆内存,提升程序性能与稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1 进程的默认堆


默认堆是在进程开始运行之前由系统创建的,在进程终止后自动销毁。

 windows的ANSI函数都是调用了UNICODE函数的。 都需要访问进程的默认堆。


2 为什么要创建额外的堆

1 对组件进行保护

更有效的内存管理

局部访问

4 避免线程同步开销

5 快速释放


3 如果创建额外的堆


HANDLE HeapCreate( DWORD flOptions, SIZE_TdwInitialSize, SIZE_TdwMaximumSize);

参数1 表示堆的分配属性

参数2 表示 初始化大小

参数3 表示 最大增加到大小 如果为0 表示自动增加的,直到用光所以的内存


谨慎使用HEAP_NO_SERIALIZE 标志,它会取消堆的序列化访问。


调用 HeapAlloc 来分配内存

LPVOID HeapAlloc( HANDLE hHeap, DWORDdwFlags, SIZE_TdwBytes);

参数1 表示 堆句柄

参数2 表示 指定一些标志

HEAP_GENERATE_EXCEPTIONS 产生一个异常

HEAP_NO_SERIALIZE 分配内存时,不需要序列化,在默认堆时,千万不要使用这样标志,有可能访问冲突。

HEAP_ZERO_MEMORY 分配的内存,清0

参数3 表示 需要的字节大小



调整内存块的大小,使用下面这个函数

LPVOID HeapReAlloc( HANDLE hHeap, DWORDdwFlags, LPVOIDlpMem, SIZE_TdwBytes);

HEAP_REALLOC_IN_PLACE_ONLY 告诉函数,不要移动内存块



获得内存块的大小

SIZE_T HeapSize( HANDLE hHeap, DWORDdwFlags, LPCVOIDlpMem);


释放内存块

BOOL HeapFree( HANDLE hHeap, DWORDdwFlags, LPVOIDlpMem);


销毁堆

BOOL HeapDestroy( HANDLE hHeap);


4 其他堆函数

Heap32First
Heap32Next

Heap32ListFirst
Heap32ListNext


GetProcessHeaps 函数 得到堆的个数

HeapValidate()堆的完整性

HeapCompact() 整理堆的碎片

HeapLock,HeapUnLock

HeapWalk 只用于调试




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值