Maison  >  Article  >  développement back-end  >  La suppression d’une entrée de carte de pointeurs provoque-t-elle des fuites de mémoire dans Go ?

La suppression d’une entrée de carte de pointeurs provoque-t-elle des fuites de mémoire dans Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-24 03:54:30463parcourir

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

En Go, la suppression d'une entrée dans une carte de pointeurs provoque-t-elle une fuite de mémoire ?

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.


Inspection des sources

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.

Construire un test pour vérifier

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 := &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)

}

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.

Conclusion

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!

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