introducción:
En una discusión reciente, se planteó que eliminó los elementos de Una porción de punteros podría conducir a fugas de memoria. Esta pregunta extiende esa consulta a los mapas, específicamente si eliminar una entrada de un mapa que contiene punteros da como resultado un comportamiento similar.
Comprobando la implementación:
para determinar la veracidad de esta afirmación, Investigamos el código fuente para la eliminación del mapa en el tiempo de ejecución de Go's: Runtime/Hashmap.go (function MapDelete ()). El examen revela que tanto la clave como el valor se borran en la eliminación ( #600, #602).
COLOING IMPLANTACIONES:
Blarando estos valores analiza efectivamente la conexión entre el mapa y el objetos puntiagudos. Esto asegura que a pesar de que los valores en sí mismos pueden ser punteros, el mapa ya no los hace referencia. Como resultado, los objetos puntiagudos se vuelven elegibles para la recolección de basura si no tienen otras referencias.
Ejemplo práctico:
para verificar este comportamiento, construyamos un caso de prueba:
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[]
En este ejemplo, el valor del puntero (p) se coloca en el mapa y se establece un finalizador a la recolección de basura. Después de eliminar la entrada del mapa y forzar la recolección de basura, se invoca el finalizador, lo que demuestra que el puntero se eliminó del mapa.
Conclusión:
Análisis y ejemplo práctico, podemos concluir que eliminar una entrada de un mapa de punteros no causa fugas de memoria. El tiempo de ejecución de GO garantiza la recolección de basura adecuada a cero los valores despejados, permitiendo que los objetos puntiagudos se recuperen cuando no existen otras referencias.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3