首页 > 解决方案 > C++ C# PInvoke 删除二维数组

问题描述

我正在尝试从 C# 中删除 C++ 指针,但我不知道我做错了什么。当我试图删除指针时,应用程序会崩溃。

在 C# 中我有

IntPtr jointAreaPointer = IntPtr.Zero;

包含来自 c++ 指针的引用,我将其转换为双数组

   double[][] polylinePoints = FromNative(ref jointAreaPointer, numberOfPairs, jointAreaCountPointerFlatArray);

public static double[][] FromNative(ref IntPtr data, int m, int[] n)
{
    var matrix = new double[m][];

    for (int i = 0; i < m; i++)
    {
        int c = n[i] * 3;

        matrix[i] = new double[c];
        Marshal.Copy(Marshal.ReadIntPtr(data), matrix[i], 0, c);
        data = (IntPtr)(data.ToInt64() + IntPtr.Size);
    }

    return matrix;
}

我从数组中获取值。

然后我尝试删除嵌套数组指针:

ReleaseNestedDouble(jointAreaPointer, numberOfPairs);

[DllImport(dllName, CallingConvention = CallingConvention.Cdecl)]
internal static extern void ReleaseNestedDouble(IntPtr arr,int count, bool isArray = true); // release input coordinates

在 c++ 中看起来像这样,并且在循环时立即崩溃:

PINVOKE void ReleaseNestedDouble(double** arr, int count, bool isArray) {
    for (int i = 0; i < count; i++) {
        delete[](arr[i]);
    }
    delete[](arr);
}

标签: c#c++arrayspinvoke

解决方案


FromNative(ref IntPtr data, ...)您的指针data中是通过引用传递的,并且是高级的,因此在调用FromNative(ref jointAreaPointer,..) 时您的变量jointAreaPointer会发生变化。

稍后您重用jointAreaPointerReleaseNestedDouble()但它不再指向它在分配期间指向的位置。


推荐阅读