2011-03-29 59 views
7

在C++/CLI,是有可能给引脚不包含元素的数组?钢钉空数组

例如

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

顺便说一句,你可能会想知道为什么我想固定一个空数组。简短的答案是我想将空和非空阵列视为简单代码。

回答

6

不,不pin_ptr <>。你可以回退到的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。

+0

感谢您的工作答案!关于你提到的有关使用'名单 ^'评论,是有一些好处不是被动态调整大小等?在特定情况下调整大小对我来说不是问题。 – dss539 2011-03-29 20:56:25

+0

只是你听起来像是在调整数组的大小。忽视。 – 2011-03-29 20:57:17

+0

关于第二个想法,你为什么不只是传递一个空指针?你永远不应该取消引用你得到的指针。至少用空指针你会注意到。 – 2011-03-29 21:01:26

1

不能针一个CLI对象array 0零元素,因为该阵列不具有存储器支持。你显然不能固定那些没有记忆力的东西。

CLI的对象array元数据仍然存在,但是,它指出数组长度为0

+1

感谢您的回答。然而,汉斯已经证明,你可以钉一个空阵列。对我来说很明显并不总是正确的。看起来我不是唯一的一个。 :d – dss539 2011-03-29 21:02:11