c# - 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);
}
解决方案
在FromNative(ref IntPtr data, ...)
您的指针data
中是通过引用传递的,并且是高级的,因此在调用FromNative(ref jointAreaPointer,..
) 时您的变量jointAreaPointer
会发生变化。
稍后您重用jointAreaPointer
,ReleaseNestedDouble()
但它不再指向它在分配期间指向的位置。
推荐阅读
- emacs - orgmode 中的注释行
- c# - 如何使用模型任何类型的 sql c# 加入 IQueryable
- c# - 如何让它让你的玩家可以每隔 n 秒跳跃一次
- python - 在没有链式索引的情况下使用 ILOC
- javascript - 将 fetch 包装在 promise 中有什么好处?
- azure-cosmosdb - 在 Azure Cosmos DB 中使用 Gremlin 重命名属性
- pmd - 我在哪里可以更改 Eclipse 上的 PMD 规则集?
- nvm - 如何连接到正确的区域或端点?
- c# - 为什么显式实现的接口成员是私有的并且与接口定义中的“公共”不一致
- javascript - 如何重新创建这种预加载效果?