这是我从CLI到native的转换字节数组的变体:
byte* GetNative(array<System::Byte, 1> ^ byteArray) {
try {
pin_ptr<unsigned char> array_pin = &byteArray[0];
return (byte*) array_pin;
}
catch(...) {
return 0;
}
}
我的问题是array_pin
。我想我需要删除它,但如果我删除它,那么带有byte*
指针的变量将被破坏(或者至少可能被破坏。)
使用此变体是否安全?或者,我必须如何以及何时删除array_pin
?有没有更简单的方法来实现字节翻译?
答案 0 :(得分:2)
array_pin
将立即取消固定,例如。当GetNative
返回时。然后,垃圾收集器可以移动或收集底层托管数组,使您返回的byte*
悬空,这将在取消引用时导致破坏。
由于pin_ptr
不能是成员变量,并且您无法将其从函数中传回,因此您需要在array_pin
仍在的情况下对非托管数组执行所有操作范围,或将数据从固定数组中复制到其他地方(例如,像std::array
)。