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和Marshal.AllocHGlobal之间的任何区别

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

如果用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()魔法——你可能甚至不知道。