Pregunta

¿Tiene algún sentido liberar memoria en una función atexit ()?

Tengo una variable global que se malloca después del inicio. Podría escribir una función atexit () para liberarla, pero ¿no va a recuperar el sistema toda la memoria cuando el programa salga de todas formas?

¿Hay algún beneficio en ser ordenado y limpiarlo activamente yo mismo?

¿Fue útil?

Solución

No en C: es como reorganizar las tumbonas mientras el barco se hunde a tu alrededor.

En C ++ la respuesta es diferente, porque los objetos pueden eliminar archivos temporales y demás en sus destructores, por lo que debe asegurarse de que se los llame.

Otros consejos

Una de las ventajas de liberarlo es que si alguna vez realiza una prueba de pérdida de memoria que intenta hacer coincidir las asignaciones con las desasignaciones durante la vida útil del proceso, no obtendrá falsos positivos de este tipo de fuga deliberada.

Ver como malloc () / free () normalmente involucra estructuras de datos extensas que existen en el espacio de usuario, free () ing memoria cuando su El programa finaliza puede ser realmente una pérdida de rendimiento. Si partes de la estructura de datos están paginadas al disco, ¡deben cargarse desde el disco solo para ser descartadas!

Mientras que si terminas sin free () , los datos enviados al disco pueden morir en paz.

Por supuesto, free () en otros momentos suele ser beneficioso, ya que más malloc () s puede reutilizar el espacio que liberó y free () puede incluso desasignar alguna memoria que luego puede ser utilizada por otros procesos.

En todos los sistemas operativos modernos, puede asumir con seguridad que toda la memoria se liberará cuando el programa salga.

En realidad, ser ordenado puede ser interesante cuando tu programa evoluciona. Te obliga a escribir la función de limpieza al crear " inicialización " funciones El beneficio llega cuando su programa se vuelve más complejo y desea reiniciar parte del programa. Si ya ha escrito funciones de limpieza en funcionamiento, es menos probable que de repente haya olvidado algo de limpieza al "reiniciar". parte de su programa.

Escribiendo funciones de limpieza " perezosamente " Es decir, solo cuando lo necesite es más propenso a errores. Escribir las funciones de limpieza lo obliga a pensar en la limpieza y la eventual dependencia de limpieza. Permite una reutilización más fácil del código de una parte de su código en otro proyecto.

Así que sí, liberar en un atexit es inútil, y también lo es cerrar el descriptor de archivo. Sin embargo, escribir y mantener la función de limpieza a medida que su código crece puede ser una restricción que lo obligará a pensar en lo que está haciendo

Debería liberar () si su código que llama atexit () es parte de una biblioteca compartida cargada dinámicamente (con dlopen (), por ejemplo). En este caso, se llamará al controlador atexit en el momento dlclose () para que el montón continúe existiendo durante el resto del proceso.

En Windows, algunas llamadas devuelven memoria que pertenece al sistema operativo o al COM y necesita liberar esa memoria explícitamente o no se liberará incluso después de que finalice su proceso. Pero este es un escenario raro.

no liberar memoria antes de la terminación del proceso no es una pérdida de memoria. es una pérdida de memoria cuando pierdes un asa. pero la memoria no es el único tipo de recurso, y otros recursos persisten en todos los procesos (como los manejadores de ventanas y los manejadores de archivos), por lo que necesita "liberarlos".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top