使用Marshal.FreeHGlobal()来释放先前在本机端使用“new”分配的数组?

时间:2017-04-04 08:51:21

标签: c# c++ memory-management marshalling

如果使用

分配动态数组
intPtr = new int[1234];

在c ++中,数据随后被封送到托管C#数组,使用

释放管理端最初分配的内存是否有效
Marshal.FreeHGlobal()

或者这会泄漏内存吗?

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

谢谢!

1 个答案:

答案 0 :(得分:1)

您无法从C#拨打free / delete。你必须这样做C / C ++方面(默认情况下new / malloc使用&#34;私有&#34; C / C ++分配器)。正确的方法是在C / C ++库中公开Free(IntPtr)方法,或者只使用共享分配器(但请注意,如果要在释放内存时调用C ++析构函数,那么你必须在C ++中进行delete

显然在C / C ++中你可以使用LocalAlloc分配内存然后在C#中你可以使用Marshal.FreeHGlobal(),但是我们在 OR中只使用共享分配器 case(你仍然遇到无法从C#调用C ++析构函数的问题)