2010-06-04 7 views

Respuesta

78

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

actualización

En la gran mayoría de los casos, el sistema operativo se libera la memoria - como es el caso de "sabores" normales de Windows, Linux, Solaris, etc. Sin embargo, es importante tener en cuenta que, en entornos especializados tales como varios sistemas operativos en tiempo real, la memoria puede no liberarse cuando finaliza el programa.

+2

Pregunta: ¿El sistema operativo realiza un seguimiento de todas las asignaciones? Cualquier memoria de montón que asigne proviene del espacio de la memoria virtual del proceso: cuando el proceso finaliza, ese espacio se devuelve al sistema al por mayor, ¿verdad? No veo por qué la contabilidad adicional sería necesaria, ya que el proceso que hace las asignaciones es el único proceso (en el territorio del usuario) con acceso a esas páginas de todos modos. ¿O me han enseñado mal? –

+5

@Justin: Sin conocer el SO, no creo que esto sea válido. Tal vez explícitamente especifique el sistema operativo del que está hablando. –

+1

Nota: la norma no dice nada al respecto. 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 y, en el pasado, existían aquellos que eran comunes y no hacían esta limpieza. –

19

El sistema operativo que ejecuta su programa generalmente tiene una memoria de limpieza que no se libera explícitamente y maneja que no se cierra explícitamente, pero esto no está garantizado por el estándar de C++. Puede encontrar algún dispositivo integrado que no libere las pérdidas de memoria.

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

Puede crear fácilmente un gran bucle de pérdidas de memoria para probarlo usted mismo. Mira cómo crece el uso de tu RAM y luego cierra tu programa. Verás que el uso de RAM vuelve a bajar.


Otra consideración a tener en cuenta cuando se utiliza C++ es que si no se suprimen su memoria asignada montón entonces sus destructores tampoco están siendo llamados. A veces tendrás otros efectos secundarios si tus destructores no son llamados.

9

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

1

Depende de la memoria que haya 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án automáticamente cuando finalice el proceso.

+5

El SO no puede recuperar parte de la memoria, como qué? –

+1

En algunos sistemas operativos en tiempo real, he visto bloques especiales de buffer Ethernet que no se limpian cuando sale un proceso. –

+1

La memoria compartida tampoco suele recuperarse, porque es posible que desee que persista para que los procesos transitorios se utilicen. –

1

Por lo que sé, un sistema operativo moderno liberará esta memoria una vez que el programa termine.

5

Normalmente, sí. Algunos sistemas admiten cosas como bloques de memoria compartida que no se liberan automáticamente cuando sale un programa. La mayoría aún mantiene un recuento de referencias y lo elimina cuando todos los programas que lo abrieron salen, pero algunas no (por ejemplo, Windows de 16 bits tenía algunos tipos de elementos que permanecerían asignados incluso cuando no se les refería, aunque usualmente se colgó por otras razones antes de que se acumule suficiente como para causar un problema ...)

Cuestiones relacionadas