Закрепление пустого массива - PullRequest
7 голосов
/ 29 марта 2011

В 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

Кроме того, вы можете задаться вопросом, почему я хотел бы закрепить пустой массив.Краткий ответ: я хочу, чтобы пустые и непустые массивы обрабатывались одинаково для простоты кода.

Ответы [ 2 ]

6 голосов
/ 30 марта 2011

Нет, не с 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>^ вместо этого.

1 голос
/ 30 марта 2011

Вы не можете закрепить объект cli array с 0 нулевыми элементами, потому что массив не имеет резервной копии памяти. Вы, очевидно, не можете прикрепить что-то, на что нет памяти, чтобы указать.

Объект Cli * Метаданные array все еще существуют, и он утверждает, что длина массива равна 0.

...