[英]Memory allocated with C++ and Marshall to C#
当我在C ++中分配内存(双指针中的结构)并通过Marshall与C#一起使用时会发生什么?
我需要清理内存吗,还是C#GarbageCollection可以帮我完成这项工作? Marshall.FreeHGlobal(vsResult);
不起作用。
[StructLayout(LayoutKind.Sequential)]
public struct MyCppResults
{
[MarshalAs(UnmanagedType.I4)] public int ResultSize;
public unsafe double* Result;
}
[DllImport("SomeVeryFastAlgorithm.dll")]
public static extern double[] LoadResults()
{
var resultsPtr = GetResults();
var vsResult = Marshal.PtrToStructure<MyCppResults>(resultsPtr);
var resultMatrix = new double[vsResult.ResultSize];
unsafe
{
for (var i = 0; i < resultMatrix.Length; i++)
resultMatrix[i] = vsResult.Result[i];
}
return resultMatrix;
}
正如Marshall.FreeHGlobal
指出的,这可以与AllocHGlobal
一起使用。 它不能与C ++ new[]
结合使用。
几乎可以肯定,由new[]
分配的内存是由C ++标准库分配的(如果没有,则由用户定义的覆盖拥有)。 这必须由delete[]
返回。
您可以从C#回调到C ++,以告诉它调用delete[]
。 逻辑位置将是C#析构函数(finalizer)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.