Memory Management of Devuelve Pointers: Una práctica segura en Go
en C, devolviendo un puntero a una variable asignada de pila puede conducir a un comportamiento indefinido debido a la deleción de la memoria al retorno de la función. Esto plantea la cuestión de si se produce un comportamiento similar en GO y si es seguro devolver tales punteros.
en Go, el comportamiento es sorprendentemente diferente. El compilador no genera ningún error para devolver los punteros alocados con pila como el siguiente ejemplo:
package main import ( "fmt" ) func main() { fmt.Println(*(something())) } func something() *string { s := "a" return &s }
A diferencia de C, este código en GO es perfectamente válido y no producirá ningún error de tiempo de ejecución. Esto se debe a que Go emplea una técnica sofisticada conocida como análisis de escape.
El análisis de escape es una optimización del compilador que determina si un valor o un puntero escapa de su alcance de función. Si se encuentra que el valor o el puntero escapa, el compilador lo coloca en el montón recogido de basura en lugar de en la pila. En este caso, el puntero devuelto *s escapa del alcance de la función Something () y, por lo tanto, se coloca en el montón.
el GO FAQ explica sucintamente la regla con respecto a la asignación de memoria: si el compilador no puede probar que una variable no se hace referencia más después de que la función regresa, asigna la variable variable en el punto de la memoria para evitar errores de puntero colgantes. Esta estrategia elimina la necesidad de la gestión de la memoria manual y garantiza que los datos puntiagudos sigan siendo accesibles después del retorno de la función.
para observar las optimizaciones de análisis de escape del compilador durante la compilación, use la opción -gcflags -m. Esta opción proporcionará información sobre las decisiones tomadas con respecto a la asignación de montón y pila.
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