En código no seguro en C# Asigné puntero a la variable controlada de tipo matriz:declaración fijo en C# y logró puntero en código IL
int[] array = new int[3];
...
fixed (int* ptr = array)
{
//some code
}
Entonces miré correspondiente parte del código IL:
.locals init ([0] int32[] 'array',
[1] int32& pinned ptr)
y me pregunto, ya que se trata de código no seguro, y es int* ptr
declaración de puntero no administrado (o eso creo por el momento), ¿por qué en el código IL no escribe int32* ptr
, en lugar de int32& ptr
?
No entendí el razonamiento: "Si se utilizan punteros no administrados para desreferenciar objetos gestionados, estos objetos se fijarán". En el código anterior, la matriz está delimitada por una declaración fija y todavía estamos utilizando un puntero administrado. – vldmrrdjcc
@Vlad; editado para aclarar – Steve
@Steve Gracias por su tiempo. Puedo notar que en su ejemplo con stackalloc int [5] ocupamos memoria en la pila, no en el montón, como con la nueva int [5], por lo que ahora esto no está sujeto a la recolección de basura, y no necesitamos arreglos declaración, ya que el compilador de C# solo le permite asignar un puntero a una variable administrada en una instrucción fija. Entonces, cuando estoy asignando un puntero a una variable administrada en una declaración fija, ¿ese puntero siempre se declara como puntero administrado? Puedo aceptar eso :) – vldmrrdjcc