gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:37:19 47 4
gpt4 key购买 nike

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

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

如果我 free() 用 Marshal.AllocHGlobal 分配的内存,如果我用 Marshal.FreeHGlobal() 释放用 malloc 分配的内存,会有什么问题吗?

谢谢

最佳答案

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

如果您使用 malloc() 分配它,则必须使用同一 C RTL 中的 free() 释放它。同样在托管方面,AllocHGlobal()应该由 FreeHGlobal() 平衡.

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

如果要使用在 native 和托管之间共享的堆,则更常见的是使用 COM 堆。在 native 端使用 CoTaskMemAlloc()CoTaskMemFree() .在托管端使用 Marshal.AllocCoTaskMem()Marshal.FreeCoTaskMem() .

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

关于c# - malloc 和 Marshal.AllocHGlobal 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9026477/

47 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com