繁体   English   中英

用C ++和Marshall分配给C#的内存

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM