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!