Heap Functions
每个进程有一个系统提供的默认堆。频繁从堆分配内存的应用程序可以通过使用私有的堆来提高性能。
私有堆调用进程地址空间中有一个或者多个页的内存块。在创建这个私有堆后,进程使用诸如HeapAlloc,HeapFree的函数来管理堆上的内存。
通过使用函数GetProcessHeap返回的句柄,这些堆函数也可以用来管理进程默认堆上的内存。新的应用程序应该使用这些堆函数而不是全局或者局部函数来达到这个效果。
从私有堆上分配的内存和通过其它内存分配函数分配的内存没有什么区别。
注意,通过函数GetProcessHeap,或者HeapCreate返回的句柄,线程只能为进程的默认堆或者线程创建和管理的私有堆调用堆函数。
通过调用进程来调用函数HeapAlloc函数,HeapCreate函数创建一个私有堆。HeapCreate函数指定一个堆内存的初始化大小和最大大小。初始化的尺寸决定一个初始化分配的读/写页面的数目。最大尺寸决定所有保留页面的数目。这些页面在进程的堆可以增长的地址空间中创建一个连续的内存块。如果HeapAlloc函数的请求超过了当前提交页面的大小,附加的页面会从保留的空间中自动的提交(加上物理存贮足够的话)。一旦页面提交,他们就不会被撤销直到进程被终结或者通过调用HeapDestroy导致
堆被释放。
私有堆对象的内存只能被创建它的进程所访问。如果一个dll创建一个私有堆,那么它是在调用它的进程的地址空间中创建的。它只能访问那个进程。
HeapAlloc 函数从从一个私有堆里面分配一定数目的字节并且返回一个指向分配区域的指针,这个指针可以被用在函数
HeapFree,HeapReAlloc,HeapSize,HeapValidate中。
通过HeapAlloc分配的内存是不能移动的。HeapAlloc函数返回的地址是有效的直到内存块被释放或者重新分配;内存块不需要来被锁定。
因为系统不能压缩私有堆,所以它可能变得支离破碎。应用程序使用不同大小的分配尺寸分配大量的堆时可以使用low-fragmentation来降低堆的破碎。
堆函数一个可能的使用就是在进程启动的时候创建一个私有堆,指定一个足够大小的内存来满足进程所需要的内存。如果调用调用HeapCreate函数失败,那么进程终止或者通知用户内存短缺;如果成功,那么就是进程确保有足够的它需要的内存。
HeapCreate请求的内存可能是或者可能不是连续的。在同一个堆中通过HeapAlloc分配的内存是连续的。你不能读写一个堆的内容除非他是函数HeapAlloc分配的,也不应该去假设HeapAlloc函数分配的不同内存区域的联系。
你也不能引用函数HeapFree已经释放的内存。在内粗被释放后,之前包含的任何信息都已经永远消失了。如果你需要那些信息,就不要释放包含信息的内存。调用返回堆信息的函数诸如HeapSize,可能没有作用了如果内存已经被释放,这样它可能返回虚假的数据。
HeapDestroy函数破坏私有堆对象。它收回和释放堆对象的的所有页面并且使堆句柄无效。
http://msdn.microsoft.com/en-us/library/aa366711(v=vs.85).aspx