我在C#中编写一个模块,用于导出一些要在C中使用的函数。 我需要为某些结构分配一些内存,以便在C< - >之间传递。 C#。
我在C中分配的内容我使用malloc,在C#中我使用Marshal.AllocHGlobal()(分配非托管内存以传递给C)。
如果我释放()使用Marshal.AllocHGlobal分配的内存,并且我使用malloc分配的Marshal.FreeHGlobal()释放内存,是否有任何问题?
由于
答案 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()
魔法 - 你甚至可能都不知道。