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

Memory allocated with C++ and Marshall to C#

本文关键字:内存 分配 Marshall      更新时间:2023-10-16

当我在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#destructor(pinalizer(。