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

C# malloc和Marshal.AllocHGlobal之间有什么区别吗?,c#,c,pinvoke,unmanaged,C#,C,Pinvoke,Unmanaged,我用C编写了一个模块,它导出了一些在C中使用的函数。 我需要为在C#之间传递的某些结构分配一些内存 我在C中分配的是malloc,在C中分配的是Marshal.AllocHGlobal()(分配要传递给C的非托管内存) 如果我用Marshal.AllocHGlobal()释放分配的内存,如果用malloc分配的Marshal.FreeHGlobal()释放内存,是否有问题 谢谢黄金法则是必须从用于分配内存的同一堆中解除分配 如果使用malloc()分配,则必须使用同一个C RTL中的free()

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

我在C中分配的是malloc,在C中分配的是Marshal.AllocHGlobal()(分配要传递给C的非托管内存)

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


谢谢

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

如果使用
malloc()
分配,则必须使用同一个C RTL中的
free()
解除分配。同样,在管理方面,也应通过以下方式进行平衡

现在,
AllocHGlobal()
是通过调用Win32函数实现的。因此,您可以通过在本机端调用来释放这样的内存。反之亦然

如果要使用在本机和托管之间共享的堆,则更常见的做法是使用COM堆。在本机端,使用和。在管理端,使用和维护


但是,您应该避免这样设计系统。坚持在托管端分配的所有内存都在托管端释放的规则要简单得多,对于本机端也是如此。如果您不遵守该规则,您很可能很快就会忘记谁对什么负责。

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

因此,我建议不要交叉使用
封送.AllocHGlobal()
malloc()
封送.FreeHGlobal()
免费()


举个例子,如果你使用一个库,它会产生一些奇妙的
malloc()/free()
magic-你甚至可能不知道。

不,它根本不起作用!没有可能,也没有可能@大卫·费弗南很有趣!我们在一个应用程序中使用了这个功能,它在Mono中正常工作,一些奇特的库开始出现问题,所以我们进行了调查。听起来它实际上不起作用。但Mono可能是另一种野兽。我假设是.net女士,因此我的评论是终局的。@DavidHeffernan没有什么要承认的,请不要把我看作是一个“正确”的人,我只是想知道你的答案,因为你的“黄金法则”正是我的“推荐”。我在回答中的观点更像是:即使你尝试了它并且它有效,也不要做!请听从大卫·费弗南的建议……谢谢。实际上,我所做的是在我的lib导出函数AllocateMem和FreeMem中创建,我建议在创建传递给lib的结构时调用程序使用这些函数。但我想知道的是,如果有人不遵守这个规则,并将分配给malloc的一些结构传递给我的lib(或其他任何东西),会发生什么?问题是这些结构有一些指向char(字符串)的指针,我必须分配这些指针并传递给调用代码。如果调用代码试图用free()释放内存呢?这就是为什么我创建了FreeMem,我用FreeHGlobal实现了它,用来在调用prog时释放内存。否则,调用代码是程序员的责任。