2011-03-29 32 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