¿Se libera la memoria filtrada cuando se cierra el programa?

Respuestas:

151

Sí, una "pérdida de memoria" es simplemente memoria a la que un proceso ya no tiene una referencia y, por lo tanto, ya no puede liberar. El sistema operativo aún realiza un seguimiento de toda la memoria asignada a un proceso y la liberará cuando ese proceso finalice.

En la gran mayoría de los casos, el sistema operativo liberará la memoria, como es el caso de los "sabores" normales de Windows, Linux, Solaris, etc. Sin embargo, es importante tener en cuenta que en entornos especializados como varios sistemas operativos en tiempo real, Es posible que la memoria no se libere cuando finalice el programa.

Justin Ethier
fuente
4
Pregunta: ¿El sistema operativo realiza un seguimiento de todas las asignaciones? Cualquier memoria de pila que asigne proviene del espacio de memoria virtual del proceso; cuando el proceso termina, ese espacio se devuelve al sistema al por mayor, ¿verdad? No veo por qué sería necesaria la contabilidad adicional, ya que el proceso que realiza las asignaciones es el único proceso (en el área de usuario) con acceso a esas páginas de todos modos. ¿O me han enseñado mal?
Chris Tonkinson
6
@Justin: Sin conocer el sistema operativo, no creo que esto sea válido. Tal vez especifique explícitamente el sistema operativo del que está hablando.
Brian R. Bondy
1
Nota: el estándar no dice nada sobre esto. Tampoco está garantizado. Esta es la forma en que funciona en la mayoría, si no en todos, los sistemas operativos modernos, pero no es necesario que lo hagan y en el pasado había algunos que eran comunes y no realizaban esta limpieza.
Edward Strange
5
Hay varios sistemas operativos en tiempo real para dispositivos pequeños y demás que no recuperan la memoria perdida en fugas. Su pregunta depende del sistema operativo del que esté hablando.
Brian Neal
14
Incluso con sistemas operativos específicos con protección de memoria, es necesario definir "fuga". Es muy posible que las aplicaciones asignen recursos del "sistema" fuera de su propio espacio de memoria (los identificadores se utilizan a menudo para identificarlos en el mundo de Windows). Cerrar su aplicación no siempre garantiza que se liberen estos tipos de recursos.
David
34

El sistema operativo que ejecuta su programa generalmente limpia la memoria que no se libera explícitamente y maneja que no se cierra explícitamente, pero esto no está garantizado por el estándar C ++. Es posible que encuentre algún dispositivo integrado que no libere sus pérdidas de memoria.

Dicho esto, Windows y todas las distribuciones de Linux que he visto liberan pérdidas de memoria.

Sin embargo, puede crear fácilmente un gran bucle de pérdidas de memoria para probarlo usted mismo. Observe cómo crece su uso de RAM y luego cierre su programa. Verá que el uso de RAM vuelve a disminuir.


Otra consideración al usar C ++ es que si no está eliminando la memoria asignada en el montón, tampoco se llamará a sus destructores. A veces, también tendrá otros efectos secundarios si no se llama a sus destructores.

Brian R. Bondy
fuente
14

¿Está ejecutando en un sistema operativo de escritorio (Windows, Linux, etc.)? Si es así, sí, en general, el sistema liberará cualquier memoria asociada con el programa cuando el programa salga.

Vicky
fuente
10

Por lo general, sí. Sin embargo, algunos sistemas admiten cosas como bloques de memoria compartida que no se liberan automáticamente cuando se cierra un programa. La mayoría aún mantienen un recuento de referencias y lo eliminan cuando todos los programas que lo abrieron salen, pero algunos no lo hacen (por ejemplo, Windows de 16 bits tenía algunos tipos de elementos que permanecerían asignados incluso cuando nada se refería a ellos, aunque Por lo general, fallaba por otras razones antes de que se acumulara lo suficiente como para causar un problema ...)

Jerry Coffin
fuente
5

Hasta donde yo sé, un sistema operativo moderno liberará esta memoria una vez que finalice el programa.

Ravibhagw
fuente
4

Depende del recuerdo que hayas filtrado. Parte de la memoria no puede ser recuperada por el sistema operativo. Sin embargo, la mayoría de la memoria en la mayoría de los sistemas operativos se recuperará automáticamente cuando el proceso finalice.

Perrito
fuente
6
Parte de la memoria no puede ser recuperada por el sistema operativo, ¿como qué?
2
En algunos sistemas operativos en tiempo real, he visto bloques de búfer de Ethernet especiales que no se limpian cuando sale un proceso.
Brian Neal
1
La memoria compartida tampoco suele recuperarse, porque es posible que desee que persista para que la utilicen los procesos transitorios.
Brian Neal