比较内存分配方法

下面简要比较了各种内存分配方法:

尽管 GlobalAllocLocalAllocHeapAlloc 函数最终会从同一堆分配内存,但每个函数提供的功能集略有不同。 例如,如果无法分配内存,则指示 HeapAlloc 引发异常,此功能不适用于 LocalAllocLocalAlloc 支持分配句柄,这些句柄允许在不更改句柄值的情况下通过重新分配移动基础内存, 此功能在 HeapAlloc 中不可用。

从 32 位 Windows 开始, GlobalAllocLocalAlloc 作为包装函数实现,这些函数使用进程默认堆的句柄调用 HeapAlloc 。 因此, GlobalAllocLocalAlloc 的开销大于 HeapAlloc

由于不同的堆分配器使用不同的机制提供独特的功能,因此必须使用正确的函数释放内存。 例如,使用 HeapAlloc 分配的内存必须使用 HeapFree 释放,而不是 LocalFreeGlobalFree。 必须使用相应的全局或本地函数查询、验证和释放使用 GlobalAllocLocalAlloc 分配的内存。

VirtualAlloc 函数允许指定内存分配的其他选项。 但是,其分配使用页面粒度,因此使用 VirtualAlloc 可能会导致更高的内存使用率。

malloc 函数的缺点是依赖于运行时。 new 运算符的缺点是依赖于编译器,依赖于语言。

CoTaskMemAlloc 函数具有在 C、C++ 或 Visual Basic 中正常工作的优点。 这也是在基于 COM 的应用程序中共享内存的唯一方法,因为 MIDL 使用 CoTaskMemAllocCoTaskMemFree 封送内存。

示例

全局和本地函数

堆函数

虚拟内存函数