malloc和Marshal.AllocHGlobal之间的任何区别
本文关键字:任何 区别 之间 AllocHGlobal Marshal malloc | 更新日期: 2023-09-27 18:21:28
我在C#中编写了一个模块,该模块导出一些要在C中使用的函数。我需要为一些要在C<->之间传递的结构分配一些内存C#。
我在C中分配的内容使用malloc,在C#中使用Marshal.AllocHGlobal()(分配要传递给C的非托管内存)。
如果我释放()用Marshal.AllocHGlobal分配的内存,如果我释放用malloc分配的Marshal.FreeHGlobal()内存,会有问题吗?
感谢
黄金法则是必须从用于分配内存的同一堆中解除分配。
如果用malloc()
分配它,则必须从同一个C RTL中用free()
解除分配它。同样,在被管理侧,AllocHGlobal()
应该被FreeHGlobal()
平衡。
现在,AllocHGlobal()
是通过调用Win32函数LocalAlloc
来实现的。因此,您可以通过调用本机端的LocalFree
来释放这样的内存。反之亦然。
如果要使用在本机和托管之间共享的堆,则更常见的是使用COM堆。在本机端使用CoTaskMemAlloc()
和CoTaskMemFree()
。在被管理侧使用Marshal.AllocCoTaskMem()
和Marshal.FreeCoTaskMem()
。
但是,您应该避免这样设计系统。坚持一条规则会简单得多,即在托管端分配的所有内存都会在那里释放,对于本机端也是如此。如果你不遵守这条规则,你很可能很快就会忘记谁应该对什么负责。
可能有问题,也可能没有问题-这完全取决于实现。永远不要依赖应用程序功能的实现细节!
因此,我建议而不是交叉使用Marshal.AllocHGlobal()
、malloc()
、Marshal.FreeHGlobal()
和free()
。
一个例子是,如果你使用一个库,它会产生某种奇特的malloc()/free()
魔法——你可能甚至不知道。