Heim > Backend-Entwicklung > Golang > Verursacht das Löschen eines Karteneintrags von Zeigern Speicherverluste in Go?

Verursacht das Löschen eines Karteneintrags von Zeigern Speicherverluste in Go?

Mary-Kate Olsen
Freigeben: 2024-10-24 03:54:30
Original
543 Leute haben es durchsucht

Does Deleting a Map Entry of Pointers Cause Memory Leaks in Go?

Verursacht das Löschen eines Eintrags in einer Karte von Zeigern in Go einen Speicherverlust?

Während des Slicens oder Das Löschen von Elementen in einem Zeigersegment kann zu einem potenziellen Speicherverlust führen. Lassen Sie uns untersuchen, ob dies auch für eine Karte gilt.


Inspizieren der Quellen

Eine Überprüfung der Go-Laufzeitquellen zeigt, dass in der Funktion „mapdelete()“ sowohl der Schlüssel- als auch der Wertspeicher beim Löschen gelöscht werden.

<br>558 func mapdelete(t <em>maptype, h </em>hmap, key unsafe.Pointer) {</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">    // ...
Nach dem Login kopieren
Nach dem Login kopieren

600 memclr(k, uintptr(t.keysize))
601 v := unsafe.Pointer(uintptr(unsafe.Pointer(b)) dataOffset BucketCntuintptr(t.keysize) iuintptr(t.valuesize))
602 memclr(v, uintptr(t.valuesize ))

    // ...
Nach dem Login kopieren
Nach dem Login kopieren

618 }

Dies bedeutet, dass alle Zeiger in Schlüsseln oder Werten auf Null gesetzt werden und ihre Referenzen unterbrochen werden auf die internen Datenstrukturen der Karte.

Konstruieren eines Tests zur Überprüfung

Um dies weiter zu demonstrieren, können wir einen erstellen test:

<br>type point struct {</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">X, Y int
Nach dem Login kopieren

}

var m = map[int ]*point{}

func main() {

fillMap()
delete(m, 1)
runtime.GC()
time.Sleep(time.Second)
fmt.Println(m)
Nach dem Login kopieren

}

func fillMap() {

p := &amp;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)
Nach dem Login kopieren

}

Beim Ausführen dieses Tests stellen wir fest, dass der registrierte Finalizer aufgerufen wird, der die Entfernung des Zeigers aus der Karte und die anschließende Speicherbereinigung bestätigt.

Fazit

In Go verursacht das Löschen eines Eintrags aus einer Zeigerkarte keinen Speicherverlust. Sowohl der Schlüssel- als auch der Wertspeicher werden beim Löschen gelöscht, wodurch alle darin enthaltenen Zeiger freigegeben werden und eine ordnungsgemäße Speicherbereinigung gewährleistet wird.

Das obige ist der detaillierte Inhalt vonVerursacht das Löschen eines Karteneintrags von Zeigern Speicherverluste in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php
Vorheriger Artikel:Wie behebe ich Probleme mit der Währungsformatierung mit „Currency.Symbol“ in Go? Nächster Artikel:Wie überwinde ich, dass SetCan() beim Festlegen von Strukturfeldwerten mithilfe von Reflection immer „False“ zurückgibt?
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Aktuelle Ausgaben
verwandte Themen
Mehr>
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage