„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Führt das Löschen eines Karteneintrags zu Speicherlecks beim Halten von Zeigern?

Führt das Löschen eines Karteneintrags zu Speicherlecks beim Halten von Zeigern?

Gepostet am 2025-02-06
Durchsuche:814

Does Deleting a Map Entry Lead to Memory Leaks When Holding Pointers?

verursacht das Löschen eines Karteneintrags Memory -Lecks?

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:

in map: 0x1040a128 & {x: 1 y: 2} Finalisiert: 0x1040A128 & {x: 1 y: 2} MAP []
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.

Freigabeerklärung Dieser Artikel wird reproduziert unter: 1729686641 Wenn ein Verstoß vorliegt, wenden Sie sich bitte an [email protected], um ihn zu löschen.
Neuestes Tutorial Mehr>

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