Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CLI到本机字节数组的转换_C++_Visual C++_C++ Cli - Fatal编程技术网

C++ 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; }

以下是我将字节数组从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(数组^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将被取消固定