Maison >développement back-end >Golang >La suppression d'une entrée de carte de pointeurs provoque-t-elle des fuites de mémoire dans Go ?
Pendant le découpage ou la suppression d'éléments dans une tranche de pointeurs peut entraîner une fuite de mémoire potentielle. Voyons si cela est également vrai pour une carte.
La vérification des sources d'exécution Go révèle que dans la fonction mapdelete(), le stockage de la clé et de la valeur est effacé lors de la suppression.
<br>558 func mapdelete(t <em>maptype, h </em>hmap, key unsafe.Pointer) {</p> <pre class="brush:php;toolbar:false"> // ...
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) ))
// ...
618 }
Cela signifie que tous les pointeurs dans les clés ou les valeurs sont remis à zéro, brisant leurs références aux structures de données internes de la carte.
Pour démontrer davantage cela, nous pouvons construire un test:
<br>type point struct {</p> <pre class="brush:php;toolbar:false">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)
}
Lors de l'exécution de ce test, nous observons que le finaliseur enregistré est appelé, confirmant la suppression du pointeur de la carte et le garbage collection ultérieur.
En Go, supprimer une entrée d'une carte de pointeurs ne provoque pas de fuite mémoire. Le stockage de la clé et de la valeur est effacé lors de la suppression, libérant tous les pointeurs qu'ils détenaient, garantissant ainsi un garbage collection approprié.
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!