gpt4 book ai didi

c# - 使用 Marshal.FreeHGlobal() 来释放之前在 native 端分配给 "new"的数组?

转载 作者:行者123 更新时间:2023-11-28 05:12:47 24 4
gpt4 key购买 nike

如果分配了一个动态数组

intPtr = new int[1234];

在 C++ 中,数据随后被编码到托管 C# 数组,是否可以使用释放托管端最初分配的内存有效

Marshal.FreeHGlobal()

或者这会泄漏内存吗?

如果这确实泄漏内存,是否有另一种方法可以在托管端使用以干净地释放内存,或者是否有必要在 native 端实现释放代码并将回调函数传递给托管端?

谢谢!

最佳答案

您不能从 C# 中调用 free/delete。您必须在 C/C++ 端执行此操作(new/malloc 默认情况下使用“私有(private)”C/C++ 分配器)。正确的做法是在 C/C++ 库中公开一个 Free(IntPtr) 方法,或者只使用共享分配器(但请注意,如果您希望在释放时调用 C++ 析构函数的内存,那么你必须在 C++ 中执行 delete)

显然在 C/C++ 中你可以使用 LocalAlloc分配内存,然后在 C# 中您可以使用 Marshal.FreeHGlobal(),但是我们处于或仅使用共享分配器的情况(您仍然有问题你不能从 C# 调用 C++ 析构函数)

关于c# - 使用 Marshal.FreeHGlobal() 来释放之前在 native 端分配给 "new"的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43202450/

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