El estándar C no tiene ningún concepto del entorno del sistema fuera de la ejecución de un solo programa, por lo que no puede especificar qué sucede "después de que el programa finalice". Al mismo tiempo, en ningún lugar exige que la memoria obtenida con malloc
se deba o deba liberarse con free
antes de una llamada al exit
o un retorno desde main
, y creo que está bastante claro que la intención es salir sin liberar manualmente la memoria no dejará los recursos atados, al igual que la llamada al exit
sin cerrar todos los archivos primero los cierra automáticamente (incluido el enjuagarlos).
Ahora, en cuanto a si se debe o no debe llamada free
, que depende mucho de su programa en particular.
- Cualquier biblioteca de códigos debe
free
cualquier memoria que se obtiene exclusivamente para uso interno tan pronto como sea posible.
- Una biblioteca que devuelve objetos asignados al programa de llamada siempre debe proporcionar una llamada correspondiente para liberar esos objetos.
- Una biblioteca que realiza asignaciones como parte de una inicialización global (nota: este es un diseño muy malo, pero a veces inevitable) debería proporcionar una forma para que la aplicación invierta esa inicialización y libere todo lo que se asignó. Esto es especialmente importante si la biblioteca puede ser cargada dinámicamente (incluso como consecuencia de la satisfacción de otras dependencias de bibliotecas cargadas dinámicamente).
Hasta ahora solo he hablado sobre el código de la biblioteca. En este punto, todo lo que queda son asignaciones hechas por la propia aplicación o en nombre de la aplicación por las bibliotecas.Mi punto de vista, y voy a admitir que no es ortodoxo, es que la liberación de tales objetos no es solo innecesaria sino dañina. La razón principal por la que digo esto es porque la mayoría de las aplicaciones de larga duración han acumulado bastante memoria asignada que no están utilizando de manera significativa (piense en el buffer de deshacer en un procesador de texto o en el historial en un navegador). En un sistema con carga moderada, gran parte de esta información se ha cambiado al disco cuando termina la aplicación. Si desea liberarla, vas a terminar caminar por toda las direcciones de memoria de salida intercambiadas rastrear todos los punteros a liberar,
- poner desgaste inútil en los componentes físicos del disco duro
- haciendo la espera del usuario de su aplicación para salir
- causando datos de otras aplicaciones todavía en uso para obtener intercambiado, por lo que corren más lento
Todo esto en el nombre de una ridícula "debe liberar todo lo que asignas "regla".
Para aplicaciones de vida corta, no es tanto una gran cosa, pero a menudo puede simplificar la implementación de aplicaciones de corta duración que realizan una única tarea lineal y salir si no se molesta en liberar toda la memoria que tienen asignar. Piensa en la mayoría de las utilidades de línea de comandos de Unix. ¿Hay algún uso para escribir los bucles para sed
para liberar todas sus expresiones regulares compiladas antes de salir? ¿No podría el tiempo de los programadores gastarse en algo más productivo?
No encontrará una respuesta definitiva sobre lo que debe hacer, pero hay respuestas definitivas sobre lo que debe hacer el estándar (no importa) y todos los sistemas operativos del mundo real (incluso DOS - tampoco le importa). Los sistemas embebidos que realmente les importan probablemente ni siquiera tengan un concepto de 'exit()', pero estoy seguro de que alguien se pondrá en pie para demostrarme que estoy equivocado. :-) –