c++ c memory-management memory-leaks malloc

c++ - memoria asignada dinámicamente después de la terminación del programa



memory-management memory-leaks (5)

Cuando se termina un programa C / C ++ que contiene la memoria asignada dinámicamente (usando malloc / new) sin llamadas gratis / eliminar, ¿qué sucede con esa memoria asignada dinámicamente? ¿El sistema operativo recupera la memoria o esa memoria se vuelve inaccesible para otros programas?


C / C ++ no tiene la característica de recolección de basura. Si asigna memoria y no la libera, no sirve de nada mientras continúa la ejecución del programa. Esto se llama pérdida de memoria. Una vez que finaliza la ejecución, el sistema operativo recupera esta memoria y está nuevamente disponible para su uso.


Durante la ejecución del programa, no puede contar con la operación de recuperación de la memoria. Esa sería una característica de recolección de basura que se encuentra en muchos otros lenguajes, como Java y C #. Si bien es posible recolectar basura en C ++, no creo que ninguna de las implementaciones convencionales lo use.

Por otro lado, una vez que su programa complete su ejecución, el sistema operativo debe recuperar la memoria utilizada por el programa. Por lo tanto, durante la ejecución, la memoria permanece fuera de los límites, pero es accesible nuevamente después de que el programa sale.


La mayoría de los sistemas operativos modernos emplean un administrador de memoria, y todos los procesos de los usuarios solo ven la llamada memoria virtual , que no está relacionada con la memoria real del sistema de una manera que el programa pueda inspeccionar. Esto significa que los programas no pueden simplemente leer la memoria de otro proceso o la memoria del kernel. También significa que el administrador de memoria "liberará" por completo toda la memoria que haya sido asignada a un proceso cuando ese proceso termine, de modo que las pérdidas de memoria dentro del programa no "afecten" al resto del sistema (aparte de forzar una gran cantidad de intercambio de discos y quizás algún comportamiento "fuera de la memoria").

Esto no significa que esté bien, de ninguna manera, es correcto tratar las fugas de memoria, solo significa que ningún programa puede corromper casualmente otros procesos en los modernos sistemas operativos multitarea (a pesar del abuso deliberado de los privilegios administrativos, por supuesto).


No creo que exista ninguna garantía en el estándar de idioma, pero los sistemas operativos modernos que admiten memoria virtual escasa y protección de memoria (como MacOS X, Linux, todas las versiones recientes de Windows y todos los teléfonos de los fabricantes actuales) se limpian automáticamente arriba después de procesos mal comportados (cuando terminan) y libera la memoria para ti. La memoria no está disponible, sin embargo, mientras el programa esté en ejecución.

Si está programando en microcontroladores, en MacOS 9 o Earler, DOS o Windows 3.x, entonces es posible que deba preocuparse por las fugas de memoria que hacen que la memoria no esté disponible para todo el sistema operativo.


Respuesta corta: sí, el sistema operativo liberará esta memoria.

La mayoría de los sistemas operativos liberarán esta memoria, sin embargo, es una mala práctica confiar en este comportamiento. Algunos sistemas operativos no liberarán esta memoria. Por ejemplo, sistemas embebidos. Para la portabilidad, siempre libera toda la memoria que asignes.