Pregunta

Puede alguien explicar por qué el siguiente código C # no se cuelga? ¿Por qué Visual Studio, permiten de hecho para su compilación? Mi entendimiento es que me estoy haciendo un puntero fijo, sino que se fija sólo en el estado 'fijo'. Cuando el puntero se devuelve desde la función 'Foo', la matriz 'Ar' puede ser recogida. entonces fuerzo GC para realmente hacer esto, pero la escritura consecutiva a la memoria (que ahora se cancela la asignación) no causa ningún error.

class Program
{
    static unsafe byte* Foo()
    {
        byte[] ar = new byte[100];
        fixed (byte* ptr = ar)
        {
            return ptr;
        }
    }

    static unsafe void Main(string[] args)
    {
        byte* ptr = Foo();
        GC.Collect();
        for (int t = 0;;++t) ptr[t%100] = 0;
    }
}
¿Fue útil?

Solución

Eric es correcta, pero la respuesta es probable que quiere escuchar es que "a veces es útil para retener la dirección fuera de la sentencia fija".

Tal vez la memoria de ese puntero ya está fijada por otra sentencia fija en otro lugar, y que tiene sentido para devolverlo? El compilador no está tratando de adivinar y dar advertencias ruidosos segundos.

Una vez dicho esto, yo espero que CodeAnalysis u otras herramientas avanzadas intervendrían aquí donde el compilador es dejar que usted corta su propio pie.

Otros consejos

El hecho de que se libera la memoria no significa que la escritura a que podría causar un error de ningún tipo. Cuando el recolector de basura recupera la memoria, sólo se marca como libre en su mapa de memoria interna -. No da vuelta al sistema operativo de inmediato, por lo que sigue siendo válida la memoria para su proceso de usar

Por supuesto, el uso de un puntero fuera del bloque fijo porque es un muy mala idea -. No practico

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top