1

这是我从 CLI 到本机的转换字节数组的变体:

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?有没有更简单的方法来实现字节转换?

4

1 回答 1

2

array_pin一旦超出范围就会被取消固定,例如。返回时GetNative。然后,垃圾收集器可能会移动或收集底层托管数组,从而使byte*您返回的数组悬空,这将在取消引用时导致损坏。

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

于 2012-06-20T12:50:39.437 回答