malloc和Marshal.AllocHGlobal有什么区别?

我写在C#中的模块导出一些函数C.要使用我需要分配SOEM内存到C之间传递一些结构< - > C#。

我在分配CI做的malloc,并在C#我做Marshal.AllocHGlobal()(分配非托管内存要传递给C)。

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

谢谢

--------------解决方案-------------

金色的规则是,你必须从用于分配内存同一个堆释放。

如果用分配它malloc()您必须在释放它free()从相同的C RTL。 同样地在管理方面, AllocHGlobal()应当通过平衡FreeHGlobal()

现在, AllocHGlobal()通过调用Win32函数实现LocalAlloc 。 所以,你可以这样释放内存调用LocalFree在本机端。 反之亦然。

如果你想使用原产之间共享和托管堆,它更常见的是使用COM堆。 在本机端使用CoTaskMemAlloc()CoTaskMemFree() 在管理端使用Marshal.AllocCoTaskMem()Marshal.FreeCoTaskMem()

然而,你应该避免设计系统是这样的。 这是更简单坚持,在管理端分配的所有内存被释放存在,同样对本机端的规则。 如果你不遵守这条规则,你可能会很快失去跟踪谁负责什么。

有可能会或可能不会成为一个问题 - 这是完全依赖于实现的。 千万不要依赖于一个实现细节为你的应用功能!

因此,我建议不要使用Marshal.AllocHGlobal() malloc()Marshal.FreeHGlobal()free()交叉。

其中一个例子,在那里你会遇到可怕的问题是,如果你使用一个库,但这某种花哨malloc()/free()魔法-你甚至可能不知道这一点。

分类:C# 时间:2015-03-15 人气:0
本文关键词: PInvoke的,非托管
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.396 (s). 10 q(s)