关于内存分配和 C++

Fan*_*c23 3 c++ visual-studio visual-c++

我从 MSDN http://msdn.microsoft.com/en-us/library/aa366533(VS.85).aspx引用:

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

现在问题来了:

a) malloc 依赖于运行时是什么意思?什么样的动态内存分配函数可以独立于运行时?这个说法听起来很奇怪。

b) new 依赖于语言吗?当然应该是对的?HeapAlloc、LocalAlloc 等语言是否独立?

c) 从纯粹的性能角度来看,MSVC 提供的例程是否更可取?

阿潘

Han*_*ant 5

使用 DLL 时会出现 malloc 和 new 的问题。根据构建选项,DLL 可能拥有自己的 CRT 副本。这使得它使用自己的堆从与 EXE 使用的堆不同的堆分配内存。当内存由一个模块分配并由另一个模块释放时,这会导致失败。使用 STL 时很常见。

解决此问题的一种方法是使用 /MD 选项编译代码。这会强制使用 CRT 的共享副本,该副本存储在其自己的 DLL 中。问题解决了,现在只有一个分配器,使用单个堆。

COM 也会出现这个问题,它允许不同的语言进行互操作。他们当然永远不会共享分配器,因为这些语言具有不同的运行时支持库。根据约定,COM 代码必须使用由 COM 运行时支持 CoTaskMemAlloc() 提供的单个分配器。

注意 HeapAlloc() 不能解决这个问题。它需要一个堆的句柄,由 HeapCreate() 返回。不同的模块必须共享该句柄以避免麻烦。


更新:在 VS2012 中解决,CRT 现在从共享堆分配,默认进程堆(GetProcessHeap 函数)。