"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > La suppression d'une entrée de carte mène-t-elle aux fuites de mémoire lors de la maintenance des pointeurs?

La suppression d'une entrée de carte mène-t-elle aux fuites de mémoire lors de la maintenance des pointeurs?

Publié le 2025-02-06
Parcourir:552

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

Does Deleting a Map Entry Cause Memory Leaks?

Introduction:
In a recent discussion, it was raised that deleting elements from Une tranche de pointeurs pourrait potentiellement conduire à 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 tenant des pointeurs se traduit par un comportement similaire.

Vérification de l'implémentation:
pour déterminer la véracité de cette affirmation, Étudions le code source de la suppression de la carte dans GO'S Runtime: 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 zéro:
Effacement de ces valeurs inverse efficacement la connexion entre la carte et la carte et la carte objets pointus. Cela garantit que même si les valeurs elles-mêmes peuvent être des pointeurs, la carte ne les fait plus référence. As a result, the pointed objects become eligible for garbage collection if they have no other references.

Practical Example:
To verify this behavior, let's construct a test case:

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

output:

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 finalisateur est défini pour être appelé à la collecte des ordures. Après avoir supprimé l'entrée de la carte et forcé la collection des ordures, le final est invoqué, prouvant que le pointeur a en effet é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 des pointeurs fait pas provoque des fuites de mémoire. Le GO Runtime garantit une collection de déchets appropriée en zéro les valeurs effacées, permettant à les objets pointus d'être récupérés lorsqu'aucune autre référence n'existe.

Déclaration de sortie Cet article est reproduit sur: 1729686641 S'il y a une contrefaçon, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3