Maison > développement back-end > Golang > le corps du texte

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

Mary-Kate Olsen
Libérer: 2024-10-24 03:54:30
original
462 Les gens l'ont consulté

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>
<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">    // ...
Copier après la connexion
Copier après la connexion

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

    // ...
Copier après la connexion
Copier après la connexion

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>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">X, Y int
Copier après la connexion

}

var m = map[int ]*point{}

func main() {

fillMap()
delete(m, 1)
runtime.GC()
time.Sleep(time.Second)
fmt.Println(m)
Copier après la connexion

}

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)
Copier après la connexion

}

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!

source:php
Article précédent:Comment résoudre les problèmes de formatage des devises avec Currency.Symbol dans Go ? Article suivant:Comment surmonter SetCan() renvoyant toujours False lors de la définition des valeurs de champ de structure à l'aide de Reflection ?
Déclaration de ce site Web
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
Derniers articles par auteur
Derniers numéros
Rubriques connexes
Plus>
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!