malloc和Marshal.AllocHGlobal之间有什么区别?

时间:2012-01-26 22:34:56

标签: c# c pinvoke unmanaged

我在C#中编写一个模块,用于导出一些要在C中使用的函数。 我需要为某些结构分配一些内存,以便在C< - >之间传递。 C#。

我在C中分配的内容我使用malloc,在C#中我使用Marshal.AllocHGlobal()(分配非托管内存以传递给C)。

如果我释放()使用Marshal.AllocHGlobal分配的内存,并且我使用malloc分配的Marshal.FreeHGlobal()释放内存,是否有任何问题?

由于

2 个答案:

答案 0 :(得分:18)

黄金法则是你必须从用于分配内存的同一堆中解除分配。

如果使用malloc()进行分配,则必须使用相同C RTL中的free()取消分配。同样在管理方面,AllocHGlobal()应由FreeHGlobal()平衡。

现在,通过调用Win32函数LocalAlloc来实现AllocHGlobal()。因此,您可以通过调用本机LocalFree来释放此类内存。反之亦然。

如果要使用本机和托管之间共享的堆,则更常见的是使用COM堆。在原生方面使用CoTaskMemAlloc()CoTaskMemFree()。在托管方使用Marshal.AllocCoTaskMem()Marshal.FreeCoTaskMem()

但是,您应该避免像这样设计系统。坚持一个规则是更加简单,即在托管端分配的所有内存都在那里被释放,同样对于本机端。如果您不遵守该规则,您可能很快就会忘记谁应对此负责。

答案 1 :(得分:3)

可能有也可能没有问题 - 这完全取决于实现。永远不要依赖应用功能的实施细节!

所以我建议横向使用Marshal.AllocHGlobal()malloc()Marshal.FreeHGlobal()free()

一个例子,如果你使用一个库,它可能会遇到某种奇特的malloc()/free()魔法 - 你甚至可能都不知道。