C++ CLI到本机字节数组的转换
以下是我将字节数组从CLI转换为本机的变体:C++ CLI到本机字节数组的转换,c++,visual-c++,c++-cli,C++,Visual C++,C++ Cli,以下是我将字节数组从CLI转换为本机的变体: byte* GetNative(array<System::Byte, 1> ^ byteArray) { try { pin_ptr<unsigned char> array_pin = &byteArray[0]; return (byte*) array_pin; } catch(...) { return 0; }
byte* GetNative(array<System::Byte, 1> ^ byteArray) {
try {
pin_ptr<unsigned char> array_pin = &byteArray[0];
return (byte*) array_pin;
}
catch(...) {
return 0;
}
}
byte*GetNative(数组^byteArray){
试一试{
pin_ptr数组_pin=&byteArray[0];
返回(字节*)数组\u引脚;
}
捕获(…){
返回0;
}
}
我的问题是关于array\u pin
。我想我需要删除它,但是如果我删除它,那么带有字节*
指针的变量将被破坏(或者至少可能被破坏)
使用这种变体安全吗?或者,我必须如何以及何时删除
array\u pin
?有没有更简单的方法来实现字节转换?数组\u pin
一旦超出范围,就会被取消固定,例如当GetNative
返回时。然后,底层托管阵列可能会被垃圾收集器移动或收集,使您返回的字节*
处于悬空状态,这将在取消引用时导致中断
由于
pin\u ptr
不能作为成员变量,也不能将其传回函数,因此您需要在array\u pin
仍在作用域内时对非托管数组执行所有操作,或者将数据从固定数组复制到其他地方(例如std::array
)?使阵列成为全局的?啊,不!您可以将其包装在特殊的类实例中,该实例提供了一个返回字节*
的访问器,或者您可以传递pin_ptr
本身。全球化几乎从来都不是答案。哎呀,不要认为保留或传递pin_ptr实际上是被允许的;它只有函数作用域生存期。这确实是一件好事,因为您不想通过将托管堆的各个部分固定在各个位置来锁定托管堆。答案已更新以反映这一点。是的,在CLI类中换行并公开固定字节,因此当托管类超出范围并被收集时,pin_ptr将被取消固定