Problem:
Trotz der Dokumentation, die bei der Manipulation von Zeigersegmenten zur Vorsicht rät Es ist unklar, ob ähnliche Vorsichtsmaßnahmen für Zeigerkarten erforderlich sind. Konkret: Sollten Einträge vor dem Löschen auf Null gesetzt werden oder die gesamte Karte gelöscht werden? Wird der Garbage Collector die Speicherfreigabe angemessen handhaben?
Untersuchung:
Die Untersuchung des Go-Laufzeitquellcodes (runtime/hashmap.go) zeigt, dass sowohl der Schlüssel- als auch der Wertspeicher vorhanden sind Wird beim Löschen der Karte gelöscht und alle darin enthaltenen Zeiger werden auf Null gesetzt.
Beweis durch Beispiel:
Der folgende Code demonstriert das Fehlen eines Speicherlecks:
<code class="go">type point struct { X, Y int } var m = map[int]*point{} func main() { fillMap() delete(m, 1) runtime.GC() time.Sleep(time.Second) fmt.Println(m) } func fillMap() { p := &point{1, 2} runtime.SetFinalizer(p, func(p *point) { fmt.Printf("Finalized: %p %+v\n", p, p) }) m[1] = p fmt.Printf("Put in map: %p %+v\n", p, p) }</code>
Ausgabe:
Put in map: 0x1040a128 &{X:1 Y:2} Finalized: 0x1040a128 &{X:1 Y:2} map[]
In diesem Beispiel wird ein Zeiger auf eine Struktur verwendet, ein Finalizer registriert, um zu erkennen, wann der Zeiger nicht mehr erreichbar ist, und dann der entsprechende Karteneintrag gelöscht. Obwohl es keine weiteren Verweise auf den Zeiger gibt, wird sein Finalizer bei der Garbage Collection aufgerufen, was seine Entfernung aus der Karte anzeigt.
Schlussfolgerung:
Basierend auf der Quellcode-Inspektion und Beispieltest: Das Löschen von Einträgen oder der gesamten Karte vor dem Löschen ist in Go nicht erforderlich. Der Garbage Collector verarbeitet die Speicherfreigabe ordnungsgemäß, auch wenn Karten Zeiger enthalten.
Das obige ist der detaillierte Inhalt vonBenötigen Zeigerkarten in Go eine spezielle Behandlung für Speicherlecks?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!