windows 核心编程之18 堆


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 只用于调试




你可能感兴趣的:(windows,核心编程)