堆
1 进程的默认堆
默认堆是在进程开始运行之前由系统创建的,在进程终止后自动销毁。
windows的ANSI函数都是调用了UNICODE函数的。 都需要访问进程的默认堆。
2 为什么要创建额外的堆
1 对组件进行保护
2 更有效的内存管理
3 局部访问
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 其他堆函数
Heap32FirstHeap32Next
Heap32ListFirstHeap32ListNext
GetProcessHeaps 函数 得到堆的个数