Windows以堆的方式来维护内存池。一个进程可以包含多个堆,可以从这些堆中分配内存。
如果单个堆足够了,就使用C库内存管理函数(malloc, free,calloc,realloc).
堆是windows对象,他们具有句柄,当分配内存时堆句柄是必须的,每个进程都有自己的缺省堆,它被malloc使用,我们也可以获得其句柄,通过 HANDLE GetProcessheap(VOID).
一个程序可以创建不同的堆,对于不同的数据结构,使用不同的堆来分配有时很方便,不同的堆优点如下:
1. 公平。没有哪个线程可以获取比分配给其堆的内存还要多的内存。的别是,由于程序忘记释放不再需要的数据单元而引起的内存泄漏,将只影响进程中的某个线程。
2. 多线程性能。每个线程具有自己的堆,线程之间的抢夺会减少,这充分提高了性能。
3. 分配效率。 在小堆内分配固定大小的数据单元比在巨大的堆内分配许多不同大小单元的效率更高,分段也减少了,而且,每个线程具有唯一的堆简化了同步,产生更高的效率。
4. 解除分配效率。整个堆及其包含的所有数据结构可以用单个函数调用来释放,该调用同时也释放堆中任何泄漏的内存分配。
5. 引用局部化的效率。 在一个小堆中维护数据结构确保单元限制在相对少量的页面中,减少了数据结构单元处理时的页面错误。
使用堆的通常过程:
1)使用CreateHeap或者GetProcessHeap 来获取一个堆句柄
2)使用HeapAlloc在堆内分配块
3)可选的,使用HeapFree释放一些或所有单个块
4)使用HeapDestory删除堆并关闭句柄。
C库的malloc在使用进程堆时与HeapAlloc是等价的,realloc对应于HeapReAlloc,而free对应于HeapFree。