2011-03-29 21 views
7

En C++/CLI, ¿es posible fijar una matriz que no contiene elementos?Fijación de una matriz vacía

p. Ej.

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

El consejo dado por MSDN no cubre el caso de las matrices vacías. http://msdn.microsoft.com/en-us/library/18132394%28v=VS.100%29.aspx

Como un aparte, puede que se pregunte por qué querría fijar una matriz vacía. La respuesta corta es que quiero tratar los arreglos vacíos y no vacíos de la misma manera para la simplicidad del código.

Respuesta

6

No, no con pin_ptr <>. Se podría vuelve a los GCHandle para lograr el mismo:

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(); 
    } 

me suena que usted debe utilizar en su lugar List<Byte>^ por cierto.

+0

Gracias por la respuesta de trabajo! En cuanto a su comentario sobre el uso de 'List ^', ¿hay algún beneficio que no sea el cambio de tamaño dinámico? Cambiar el tamaño no es un problema para mí en el escenario particular. – dss539

+0

Solo que sonaba como si estuviera cambiando el tamaño de las matrices. Ignorar. –

+0

Pensándolo bien, ¿por qué no pasas un puntero nulo? Nunca debes desreferenciar el puntero que obtienes de todos modos. Al menos con un puntero nulo notarás. –

1

No se puede anclar un objeto cli array con 0 elementos cero porque la matriz no tiene respaldo de memoria. Obviamente no se puede anotar algo que no tiene memoria para señalar.

todavía existe la CLI objeto array metadatos, sin embargo, y se establece que la longitud del arreglo es 0.

+1

Gracias por la respuesta. Sin embargo, Hans ha demostrado que puedes fijar una matriz vacía. Lo que es obvio para mí no siempre es correcto. Parece que no soy el único. :RE – dss539

Cuestiones relacionadas