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。他の場所 (std::arrayたとえば、 a など)。

于 2012-06-20T12:50:39.437 に答える