中间函数可以降低可以降低编译器与操作系统间的耦合度,还可以借助这些中间函数加入内存检查功能来辅助调试。
下面介绍 HeapFree函数,HeapFree用来释放使用HeapAlloc 分配的内存
BOOL WINAPI HeapFree(
__in HANDLE hHeap,
__in DWORD dwFlags,
__in LPVOID lpMem
);
如果长时间的在内存空间中分配和释放堆,那么堆上可分配的很琐碎,如果再试图分配堆时,即使可使用的空间总和大于请求的空间,但因为没有一块连续的空间可以满足,因为堆函数返回的必须是地址连续的一段空间,那么分配请求仍会失败,这种现象称为堆碎片(heap fragmentation).
Window XP 和Windows Server 2003引入了低碎片堆(Low Fragmentation Heap),简称LFH。LFH将堆上的可用空间划分成128个bucket(桶位),编号为1~128,每个桶位的空间大小依次递增,1号桶为8个字节,128号桶位16KB,所以分配时可以按所请求的字节最小的可用桶分配。另外LFH为不同桶分配的粒度也不同,桶的容量越大,分配的粒度也越大。
可以通过HeapSetInformation来设置LFH。
堆的调试功能:堆管理器根据当前进程的全局标志(Global Flags)来决定是否启用堆的调试功能。操作系统的进程加载器在加载一个进程时会从注册表中读取进程的全局标志值,是在HLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options表键下寻找以该程序名命名的子键,如果存在这样的子键,那么读取下面的GlobalFlag就是该程序使用的全局标志。
在Windbg下可以使用
gflags –i HeapHFC.exe +hfc
来指定HeapHFC.exe程序执行hfc(堆尾检查).
如果启动了堆的调试功能,那么堆管理器会把安全检查和调试支持放在第一位,会使用带有全面检查功能的分配和释放函数,这样会导致程序执行速度的下降。