原文连接:http://msdn.microsoft.com/en-us/library/windows/desktop/aa366533(v=vs.85).aspx
下面简要比较一下各种内存分配方式:
CoTaskMemAlloc
GlobalAlloc
HeapAlloc
LocalAlloc
Malloc
New
VirtualAlloc
GlobalAllocLocalAlloc和HeapAlloc基本上都是从堆中分配内存,但是他们提供的功能略有不同。例如:HeapAlloc在分配内存失败时会引发异常,而LocalAlloc却不行。同样,LocalAlloc支持内存再分配操作(增加或者减少皆可)且保持操作句柄不变,而HeapAlloc却不支持这种方式。
从32位Windows系统开始,因为GlobalAlloc和LocalAlloc通过封装HeapAlloc函数实现,所以GlobalAlloc和LocalAlloc比HeapAlloc开销更大。
因为不同的内存分配函数使用不同的机制实现相应的功能,所以在释放内存时需要使用对应的释放函数。例如HeapAlloc必须对应HeapFree,GlobalAlloc或者LocalAlloc也需要使用对应的函数进行相应的处理。
VirtualAlloc函数允许在分配内存是使用附加的条件,然而该函数分配内存以页为单位,所以会导致较高的内存使用量。
Malloc函数的缺点是运行时依赖,new操作的缺点是编译器和语言相关的依赖。
CoTaskMemAlloc可以在C、C++和VB环境下良好的执行。自从MIDL使用CoTaskMemAlloc和CoTaskMemFree来整理内存,使得其成为唯一能在COM为基础的应用中实现内存共享的方法。