我在C#方法中使用像这样的参数将C ++中的整数数组传递给C#:
[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)]
UInt32[] myStuff,
当这些数据到达CLR时,我认为“LPArray”表示我正在使用来自C ++ - world的指针直接?所以如果我想在方法调用结束后保留这个数组,我应该复制它吗?
答案 0 :(得分:1)
您必须要小心,在托管和非托管环境中使用相同的内存分配机制进行分配。即使是这种情况,制作副本并使用它也更安全。
注意:在您的示例中,指针未通过引用传递,因此被调用者只能添加到您之前的数组,而不是为您提供新数组。这真的是你的意图吗?
答案 1 :(得分:0)
从非托管代码调用托管代码(C ++到C#),数组被复制到完全托管的数组中。当垃圾收集器注意到没有人有任何对它的引用时,将释放此数组,而不是在函数退出时。
但是另一个方向更危险:如果你正朝着另一个方向(C#转换为C ++),那么它将:固定C#数组以便它不会移动,或者将数组的临时副本转换为非托管内存(当函数返回时会释放)。在任何一种情况下,在函数调用完成后保持C ++端的数组是不安全的,你想要将内容复制到其他地方。