内存分配函数分类

4种用于内存分配的API函数。虚拟VIRTUAL函数用于分配和管理大数量的内存,堆函数HEAP用于小数量内存,全局函数GLOBAL及局部函数LOCAL用于小数量内存分配,这两类函数是为了实现与16位系统兼容而提供的。WIN32 API仍然维护全局以及局部的堆函数,但是它们都是从局部的2GB中分配内存。这些堆对于进程而言都是局部的,不能被其他进程访问。

       当一个程序需要分配一个至少几KB缓存时,使用VIRTUALALLOC函数获得内存块。它以4KB为单位获取内存,分配的内存以4KB来对齐。当程序需要为小对象,数组或者结构分配内存时,调用HEAPALLOC函数更合适。将VIRTUALALLOC函数用于对小数据结构的访问会造成内存资源的浪费。

       每个进程都有一个默认堆,但是为了提高效率和便于管理,程序也可以分配额外的堆。每个堆都有自己的句柄,调用GETPROCESSHEAP函数获得默认堆的句柄。

       进程中的线程可以访问进程中的默认堆,WIN32内存管理对堆的访问是串行的。当一个线程执行一个堆函数时,其他线程对内存的请求就会被挂起直到函数结束。这样会给程序带来很小的延迟。如果一个线程需要访问一些堆并且不想与其他线程分享这个堆,那么为线程分配私有堆PRIVATE HEAP要比使用默认堆快得多。在线程使用私有堆的情况下,可以在堆分配时选择不对堆进行串行化处理。这样的话,那些需要其他堆空间的其他线程就不会被延迟。如果需要使用方便或者需要代码紧凑就应使用默认堆,如果需要速度则应使用线程私有堆。

       动态链接库在默认情况下不拥有自己的堆,它与调用它的进程共享堆,DLL可以分配自己的私有堆并使用它。

       当程序使用完堆以后一定要释放堆。否则会产生内存泄漏MEMORY LEAK。一个规则就是,谁分配谁释放。

原文地址:https://www.cnblogs.com/hnxxcxg/p/2940700.html