2011-01-18 14 views
12

Cuando analizamos las pilas de memoria, después de 4 tipos de GC se encarga de que por lo general viene a través de:¿Cuál es la idea detrás de 'mango GC Fijado'?

  1. Débil: - Un mango GC débil no impedirá la instancia que corresponde al de ser recogido de basura. Example, used by the System.WeakReference class instances.

  2. normal: - Un mango GC normal, impide la instancia correspondiente de ser recogido de basura. Example, used by the instances of strong references.

  3. RefCounted: - Un mango de referencia contado GC es usado internamente por el tiempo de ejecución, example, when dealing with COM interfaces.

  4. clavado: - ¿Por qué necesitamos este tipo de GC manejar? ¿Es sólo para evitar el movimiento de esa instancia en la memoria o is there any other notion behind this? I want to know the notion behind Pinned GC handle(with an example).

Editado por la respuesta de Itay: - Tengo un no vacío Expandido DiffCell [] [] las que se une a una cuadrícula de datos en WPF. Al cerrar la ventana en la que está presente esta cuadrícula de datos, en el montón veo Pinned GC manejar apuntando a este vacío DiffCell array a través de objeto [] (ver instantánea). I am not using any unsafe code. I am just setting ItemsSource of data grid to null before closing that window. So my question is who does pin this array on heap and why?

alt text

Respuesta

7

Necesitamos esto en caso de que usamos punteros.
Imagínese que se declara un puntero a una ubicación de memoria y usted no fija en.
El GC se mueven a veces trozos de memoria a otros lugares por lo que el puntero no válido obtendrá.

por ejemplo:

public unsafe void DoSomething(byte b) 
{ 
    byte * bp = &b; 
} 

esto no compilará porque no reajuste de la ubicación de memoria que contiene el byte.
Con el fin de precisar que se puede utilizar:

public unsafe void DoSomething(byte b) 
{ 
    fixed(byte * bp = &b) 
    { 
     //do something 
    } 
} 
+0

Gracias Itay! Por favor, consulta la pregunta editada y cuéntame tus comentarios al respecto. –

+0

Realmente no sabemos cómo WPF y el trabajo de unión, así que temo que no puedo ayudar aquí. –

3

No se olvide GCHandle que soporta objetos fijar (y recuperando la dirección como un IntPtr). Los objetos de fijación no son exclusivos del código inseguro (la declaración fija).

Cuestiones relacionadas