Einführung:
In einer kürzlich durchgeführten Diskussion wurde erhoben, dass das Löschen von Elementen aus dem Löschen von Elementen aus Ein Stück Zeiger könnte möglicherweise zu Speicherlecks führen. Diese Frage erweitert diese Anfrage zu Karten, insbesondere ob das Löschen eines Eintrags aus einer Karte, die Zeiger hält, zu ähnlichem Verhalten führt.
die Implementierung überprüfen:
, um die Wahrhaftigkeit dieser Behauptung zu bestimmen, Untersuchen wir den Quellcode für die Kartenlöschung in der Laufzeit von Go: Laufzeit/Hashmap.go (Funktion MapDelete ()). Die Prüfung ergibt spitze Objekte. Dies stellt sicher, dass die Karte, obwohl die Werte selbst möglicherweise Zeiger sind, die Karte nicht mehr verweist. Infolgedessen können die spitzen Objekte für die Müllsammlung berechtigt sind, wenn sie keine anderen Referenzen haben.
Praktisches Beispiel:
Um dieses Verhalten zu verifizieren ]
type point struct {
X, y int
}
var m = map [int]*point {}
func main () {
fillmap ()
löschen (m, 1)
runtime.gc ()
time.sleep (time.second)
fmt.println (m)
}
func fillmap () {
P: = & amp; Punkt {1, 2}
RunTime.SetFinalizer (P, Func (p *point) {
fmt.printf ("finalized: % p % v \ n", p, p)
})
M [1] = p
fmt.printf ("MAP eingeben: % p % v \ n", p, p)
} output:
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)
}
Schlussfolgerung:
Put in map: 0x1040a128 &{X:1 Y:2} Finalized: 0x1040a128 &{X:1 Y:2} map[]basierend auf dem Quellcode Analyse und praktisches Beispiel können wir schließen, dass das Löschen eines Eintrags aus einer Karte von Zeigern
nicht
Memory -Lecks verursacht. Die GO -Laufzeit sorgt für die ordnungsgemäße Müllsammlung, indem die gelöschten Werte aufgenommen werden, sodass die spitzen Objekte zurückgefordert werden können, wenn keine anderen Referenzen vorhanden sind.Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3