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

bza*_*fir 11 c c# pinvoke unmanaged

我在C#中编写了一个模块,它导出了一些在C中使用的函数.我需要为C < - > C#之间的一些结构分配一些内存.

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

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

谢谢

Dav*_*nan 19

黄金法则是您必须从用于分配内存的同一堆中释放.

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

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

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

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