CLI到本机字节数组转换

时间:2012-06-20 12:42:39

标签: c++ visual-c++ c++-cli

这是我从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?有没有更简单的方法来实现字节翻译?

1 个答案:

答案 0 :(得分:2)

一旦超出范围,

array_pin将立即取消固定,例如。当GetNative返回时。然后,垃圾收集器可以移动或收集底层托管数组,使您返回的byte*悬空,这将在取消引用时导致破坏。

由于pin_ptr不能是成员变量,并且您无法将其从函数中传回,因此您需要在array_pin仍在的情况下对非托管数组执行所有操作范围,或将数据从固定数组中复制到其他地方(例如,像std::array)。