Maison  >  Article  >  développement back-end  >  La suppression d’une entrée de carte entraîne-t-elle des fuites de mémoire lors de la détention de pointeurs ?

La suppression d’une entrée de carte entraîne-t-elle des fuites de mémoire lors de la détention de pointeurs ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-24 00:47:02548parcourir

Does Deleting a Map Entry Lead to Memory Leaks When Holding Pointers?

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

Introduction :
Dans une discussion récente, il a été soulevé que la suppression d'éléments de une tranche de pointeurs pourrait potentiellement entraîner des fuites de mémoire. Cette question étend cette enquête aux cartes, en particulier si la suppression d'une entrée d'une carte contenant des pointeurs entraîne un comportement similaire.

Vérification de la mise en œuvre :
Pour déterminer la véracité de cette affirmation, étudions le code source pour la suppression de la carte dans le runtime de Go : runtime/hashmap.go (fonction mapdelete()). L'examen révèle que la clé et la valeur sont effacées lors de la suppression (#600, #602).

Implications de la réduction à zéro :
La suppression de ces valeurs rompt efficacement la connexion entre la carte et le objets pointus. Cela garantit que même si les valeurs elles-mêmes peuvent être des pointeurs, la carte ne les référence plus. En conséquence, les objets pointés deviennent éligibles au garbage collection s'ils n'ont pas d'autres références.

Exemple pratique :
Pour vérifier ce comportement, construisons un cas de test :

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

Sortie :

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

Dans cet exemple, la valeur du pointeur (p) est placée dans la carte et un finaliseur est configuré pour être appelé lors du garbage collection. Après avoir supprimé l'entrée de la carte et forcé le garbage collection, le finaliseur est invoqué, prouvant que le pointeur a bien été supprimé de la carte.

Conclusion :
Basé sur le code source Analyse et exemple pratique, nous pouvons conclure que la suppression d'une entrée d'une carte de pointeurs ne pas provoque des fuites de mémoire. Le runtime Go garantit un garbage collection approprié en remettant à zéro les valeurs effacées, permettant ainsi aux objets pointés d'être récupérés lorsqu'aucune autre référence n'existe.

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