Maison  >  Article  >  développement back-end  >  Les cartes de pointeurs dans Go nécessitent-elles un traitement spécial en cas de fuite de mémoire ?

Les cartes de pointeurs dans Go nécessitent-elles un traitement spécial en cas de fuite de mémoire ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-23 22:25:30987parcourir

Do Maps of Pointers in Go Need Special Handling for Memory Leaks?

Fuite de mémoire dans Go : Carte des pointeurs

Problème :

Malgré la documentation conseillant la prudence lors de la manipulation de tranches de pointeurs , il n'est pas clair si des précautions similaires sont nécessaires pour les cartes de pointeurs. Plus précisément, les entrées doivent-elles être définies sur zéro avant la suppression ou la carte entière doit-elle être effacée ? Le garbage collector gérera-t-il correctement la désallocation de mémoire ?

Enquête :

L'examen du code source du runtime Go (runtime/hashmap.go) révèle que le stockage des clés et des valeurs est effacé lors de la suppression de la carte, mettant à zéro tous les pointeurs qu'ils contiennent.

Preuve par exemple :

Le code suivant démontre l'absence de fuite de mémoire :

<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>

Sortie :

Put in map: 0x1040a128 &{X:1 Y:2}
Finalized: 0x1040a128 &{X:1 Y:2}
map[]

Cet exemple utilise un pointeur vers une structure, enregistre un finaliseur pour détecter quand le pointeur devient inaccessible, puis supprime son entrée de carte correspondante. Malgré aucune autre référence au pointeur, son finaliseur est appelé au garbage collection, indiquant sa suppression de la carte.

Conclusion :

Basé sur l'inspection du code source et Un exemple de test, l'effacement des entrées ou de la carte entière avant la suppression n'est pas nécessaire dans Go. Le garbage collector gérera correctement la désallocation de mémoire même lorsque les cartes contiennent des pointeurs.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn