固定一个空数组

时间:2011-03-29 19:47:15

标签: interop c++-cli

在C ++ / CLI中,是否可以固定一个不包含元素的数组?

e.g。

array<System::Byte>^ bytes = gcnew array<System::Byte>(0);
pin_ptr<System::Byte> pin = &bytes[0]; //<-- IndexOutOfRangeException occurs here

MSDN提供的建议不包括空数组的情况。 http://msdn.microsoft.com/en-us/library/18132394%28v=VS.100%29.aspx

顺便说一句,你可能想知道为什么我想要固定一个空数组。简短的回答是,为了简化代码,我想对空数组和非空数组进行相同处理。

2 个答案:

答案 0 :(得分:6)

不,不是用pin_ptr&lt;&gt;。你可以回到GCHandle来实现同样的目标:

using namespace System::Runtime::InteropServices;
...
    array<Byte>^ arr = gcnew array<Byte>(0);
    GCHandle hdl = GCHandle::Alloc(arr, GCHandleType::Pinned);
    try {
        unsigned char* ptr = (unsigned char*)(void*)hdl.AddrOfPinnedObject();
        // etc..
    }
    finally {
        hdl.Free();
    }

听起来我应该使用List<Byte>^而不是btw。

答案 1 :(得分:1)

您不能将cli对象array与0个元素相关联,因为该数组没有内存支持。你显然无法固定没有记忆的东西。

然而,cli对象array元数据仍然存在,并且它表明数组长度为0。