comprensión de la memoria filtración en go slice
con cortes en Go, es esencial comprender el potencial para las filtraciones de memoria, especialmente cuando los pointers están involucrados. conneros a enteros ([]*int):
s: = []*int {new (int), new (int)}Este pordico tiene una matriz de respaldo con una longitud de 2 y contiene 2 indicadores no nil que apuntamos a enteros asignados fuera de la matriz. IT:
s = s [: 1]la longitud se convierte en 1, pero la matriz de respaldo permanece intacta. El puntero no utilizado en el segundo elemento todavía está en la memoria como parte de la matriz. Dado que el recolector de basura no se hace referir, lo que da como resultado una filtración de memoria.
s := []*int{new(int), new(int)}
¿por qué no los no pointers?
con un porte de non-pointers ([] int):
s := []*int{new(int), new(int)}t: = [] con un porta 2}
corte, simplemente ocultará los elementos de la nueva porción, pero permanecen en la matriz de respaldo. A diferencia de los punteros, estos elementos son parte de la matriz en sí y no hacen referencia a la memoria externa.
Pointers and Structs
Cuando un porte contiene estructuras que contienen punteros, pueden ocurrir filtraciones de memoria:
s := []*int{new(int), new(int)}type books struct { cadena de título cadena de autor } ... var bkslice = [] libros {book1, book2} bkslice = bkslice [: 1]
aunque el porta solo conserva el libro1, las cadenas de autor y títulos de Book2 todavía están en la memoria como parte de la matriz. Para evitar esto, asigne el valor cero al libro2 antes de cortar:
bkslice [1] = libro {} bkslice = bkslice [: 1]
esto elimina la referencia a las cadenas en Book2, permitiendo que se recopilen basura.
type Books struct { title string author string } ... var bkSlice = []Books{Book1, Book2} bkSlice = bkSlice[:1]
para evitar fugas de memoria, apuntando a cero los elementos que se refieren a la memoria fuera del recorte de la recortación de la luz. Por ejemplo, las estructuras con campos que son punteros, cortes u otras estructuras de datos complejas deben cero antes de reliquarse para cortar las referencias externas.
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