2009-10-16 28 views
5

Ich habe eine doppelt verkettete Liste (Warteschlange), die ich selbst erstellt habe.Löschen einer doppelt verketteten Liste

Ich frage mich, um die verknüpfte Liste zu löschen, ist es genug, um einfach die Kopf- und Schwanzreferenzen zu entfernen?

Z. B

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

ich einen Domino-Effekt Bebilderung, aber ich habe eine harte Zeit, es zu testen. Es wird das ganze Objekt mindestens leer erscheinen lassen. Alle Datenanforderungen (wie Peek, Dequeue usw.) geben null zurück. Sie können auch einige neue Objekte leicht in die Warteschlange stellen. Rein funktional scheint es zu funktionieren.

Aber ich würde wirklich gerne wissen, ob ich es richtig mache.

Antwort

7

Die kurze Antwort ist ja, Garbage Collection löscht alle verknüpften Listenknoten, vorausgesetzt, dass nichts Externes einen Verweis auf sie enthält.

Der einfachste Weg zum Testen besteht darin, einen Finalizer zu Ihrem Linked-List-Node-Objekt hinzuzufügen, der eine Protokollierung ausgibt. Beachten Sie, dass Sie nicht sicher sein können, wann der Garbage Collector ausgeführt wird (ohne ihn über GC.Collect() zu erzwingen), sodass der Finalizer nicht aufgerufen wird, sobald Sie die Clear() -Methode aufrufen.

Der "Domino-Effekt" wird jedoch nicht passieren; Es spielt keine Rolle, ob Verweise auf ein Objekt gehalten werden, anstatt Referenzen auf den Stapel oder ein statisches Objekt zurückführen zu können. Wenn also mehrere Objekte aufeinander verweisen, sich aber nichts auf sie bezieht, werden sie alle gleichzeitig als Müll gesammelt.

+0

Danke, es erklärt die Dinge gut – CasperT

4

Sofern die Objekte in der Sammlung nicht entsorgt werden müssen, und es liegt in der Verantwortung der Sammlung, dies zu tun, dann ist Ihre Methode wahrscheinlich der beste Weg.

Da das Objekt keinen Stamm hat (keine Live-Referenzen), kann Garbage Collection es aufheben und entfernen.

+0

Die Frage ist, wird dies in einem Durchlauf des GC passieren, oder wird jede ‚Reihe‘ in dem Domino-Effekt als OP beschreibt es einen einzigen Durchlauf nehmen? –

+0

Danke für die Antwort. Es war beruhigend. Ich werde FacticiusVir obwohl akzeptieren, weil er erklärte, was ausführlicher geschieht :) – CasperT

+2

Es wird in einem Durchgang geschehen.Garbage Collection entfernt nicht nur Objekte ohne Live-Referenzen, sondern versucht Verweise auf sogenannte "roots" zurückzuverfolgen, im Wesentlichen Dinge wie statische Variablen, lokale Variablen in noch laufenden Methoden usw. Wenn eine lange Kette von Objekten hat keine solche verwurzelte Referenz, die gesamte Kette kann im gleichen Durchgang gesammelt werden. –

2

Ich bin Bildgebung einen Domino-Effekt

Dies ist nicht, wie die GC funktioniert.

Der GC markiert zuerst alles "tot", dann beginnend mit den Wurzelobjekten durchläuft er alle Objekte, die von ihnen referenziert werden und markiert jeden als "lebendig".

Da Ihre Liste keine Referenz mehr durch Wurzelobjekte (oder untergeordnete Objekte) ist, wird sie als "tot" markiert.

Der zweite Durchlauf gibt dann die "toten" Objekte frei.

Ich bezweifle, dass Sie in einem Finalizer davon ausgehen können, dass Objekte auf beiden Seiten der Liste nicht zuerst gesammelt wurden, dh es wird in der eigenen Reihenfolge des GC und nicht in der Reihenfolge der Liste sein.

ein bisschen mehr Detail hier: - http://msdn.microsoft.com/en-us/magazine/bb985010.aspx

Verwandte Themen