2009-10-16 11 views
5

Tengo una lista de doble enlace (cola) que he creado por mi cuenta.Borrado de una lista de doble enlace

Me pregunto, para borrar la lista vinculada, ¿es suficiente simplemente eliminar las referencias de cabeza y cola?

por ejemplo

public void Clear() 
{ 
    Head = null; 
    Tail = null; 
} 

Estoy imágenes de un efecto dominó, pero estoy teniendo dificultades para probarlo. HARÁ que el objeto entero parezca vacío al menos. Todas las solicitudes de datos (como peek, dequeue, etc.) devuelven null. También puede enrutar fácilmente algunos objetos nuevos. Puramente funcional, parece estar funcionando.

Pero realmente me gustaría saber si lo estoy haciendo de la manera correcta.

Respuesta

7

La respuesta corta es sí, la recolección de elementos no utilizados eliminará todos los nodos de la lista enlazada, siempre que nada externo contenga una referencia a ellos.

La manera más fácil de probar es agregar un finalizador al objeto del nodo de la lista vinculada que genera algunos registros. Tenga en cuenta que no puede estar seguro de cuándo se ejecuta el recolector de elementos no utilizados (sin forzarlo, a través de GC.Collect()), de modo que no verá el finalizador llamado tan pronto como le llame al método Clear().

El "efecto dominó" no va a suceder, sin embargo; no importa si las referencias se guardan en un objeto, en lugar de que las referencias se remonten a la pila o a un objeto estático. Entonces, si varios objetos se refieren el uno al otro, pero nada se refiere a ellos, entonces todos serán basura recolectada simultáneamente.

+0

Gracias, explica bien las cosas – CasperT

4

A menos que los objetos de la colección deban deshacerse de ellos, y es la responsabilidad de la colección de hacer eso, entonces su método es probablemente la mejor manera.

Dado que no hay raíz para el objeto (sin referencias en vivo), la recolección de basura puede recogerlo y eliminarlo.

+0

La pregunta es, sucederá esto en una sola pasada de la GC, o será cada 'fila' en el efecto dominó como el PO describe se necesita una sola pasada? –

+0

Gracias por la respuesta. Estaba volviendo a asegurar. Sin embargo, aceptaré FacticiusVir , porque me explicó lo que sucederá más a fondo :) – CasperT

+2

Sucederá en una sola pasada.Garbage Collection no solo elimina objetos sin referencias en vivo a ellos, sino que intenta rastrear referencias a lo que se conoce como "raíces", básicamente cosas como variables estáticas, variables locales en métodos que se ejecutan aún, etc. Si una cadena larga de objetos no tiene tal referencia arraigada, toda la cadena se puede recoger en el mismo pase. –

2

Estoy imágenes de un efecto dominó

Esto no es cómo funciona el GC.

El GC primero marca todo "muerto", luego comienza en los objetos raíz que atraviesa todos los objetos a los que hace referencia, marcando cada uno como "vivo".

Dado que su lista ya no es referencia por ningún objeto raíz (o hijos de) se dejará marcado como "muerto".

La segunda pasada libera los objetos "muertos".

Dudo que pueda suponer en un finalizador que ningún objeto de ninguno de los lados de la lista se ha recopilado primero, es decir, que estará en el orden propio del GC, no en el orden de la lista.

un poco más detalle aquí: - http://msdn.microsoft.com/en-us/magazine/bb985010.aspx

Cuestiones relacionadas