Maison >développement back-end >Golang >Comment puis-je éviter les fuites de mémoire lors du retranchage de tranches Go avec des pointeurs ?

Comment puis-je éviter les fuites de mémoire lors du retranchage de tranches Go avec des pointeurs ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-26 03:08:13870parcourir

How Can I Avoid Memory Leaks When Reslicing Go Slices with Pointers?

Comprendre les fuites de mémoire dans Go Slice

Lorsque vous travaillez avec des tranches dans Go, il est essentiel de comprendre le potentiel de fuites de mémoire, en particulier lorsque les pointeurs sont impliqués.

Fuites de mémoire avec Pointeurs

Considérons une tranche de pointeurs vers des entiers ([]*int) :

s := []*int{new(int), new(int)}

Cette tranche a un tableau de support d'une longueur de 2 et contient 2 non nuls des pointeurs pointant vers des entiers alloués en dehors du tableau.

Maintenant, si nous retranchons it :

s = s[:1]

La longueur devient 1, mais le tableau de support reste intact. Le pointeur inutilisé dans le deuxième élément est toujours en mémoire dans le cadre du tableau. Puisqu'il n'est référencé par aucune tranche, il devient inaccessible et ne peut pas être libéré par le ramasse-miettes, ce qui entraîne une fuite de mémoire.

Pourquoi pas des non-pointeurs ?

Avec une tranche de non-pointeurs ([]int) :

t := []int{1, 2}

La découper en tranches masquera simplement les éléments de la nouvelle tranche, mais ils resteront dans le tableau de support. Contrairement aux pointeurs, ces éléments font partie du tableau lui-même et ne font pas référence à la mémoire externe.

Pointeurs et structures

Lorsqu'une tranche contient des structures contenant des pointeurs, des fuites de mémoire peut se produire :

type Books struct {
    title string
    author string
}
...
var bkSlice = []Books{Book1, Book2}
bkSlice = bkSlice[:1]

Même si la tranche ne conserve que le Livre1, les chaînes d'auteur et de titre du Livre2 sont toujours en mémoire car partie du tableau. Pour éviter cela, attribuez la valeur zéro à Book2 avant de découper :

bkSlice[1] = Book{}
bkSlice = bkSlice[:1]

Cela supprime la référence aux chaînes de Book2, ce qui leur permet d'être récupérées.

Règle générale

Pour éviter les fuites de mémoire, essayez de mettre à zéro les éléments qui font référence à la mémoire en dehors du tableau de sauvegarde de la tranche. Par exemple, les structures avec des champs qui sont des pointeurs, des tranches ou d'autres structures de données complexes doivent être remises à zéro avant d'être retranchées pour couper les références externes.

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