Si programé, sin saberlo, una pérdida de memoria y la aplicación finaliza, ¿se libera la memoria filtrada?¿La memoria filtrada se libera cuando sale el programa?
Respuesta
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.
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.
¿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.
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.
El SO no puede recuperar parte de la memoria, como qué? –
En algunos sistemas operativos en tiempo real, he visto bloques especiales de buffer Ethernet que no se limpian cuando sale un proceso. –
La memoria compartida tampoco suele recuperarse, porque es posible que desee que persista para que los procesos transitorios se utilicen. –
Por lo que sé, un sistema operativo moderno liberará esta memoria una vez que el programa termine.
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 ...)
- 1. ¿Un programa C++ libera automáticamente la memoria cuando se bloquea?
- 2. C++ destructor: cuando la memoria se libera?
- 3. C: Hacer algo cuando el programa sale
- 4. ¿Se libera la memoria cuando lanzo una excepción?
- 5. ¿El programa Clojure no sale cuando finaliza la última declaración?
- 6. ¿Cómo se libera el espacio asignado dinámicamente cuando se interrumpe un programa con Ctrl-C?
- 7. ¿la memoria asignada por kmalloc() se libera automáticamente?
- 8. .net ¿ArrayList.Clear libera memoria?
- 9. Función de llamada cuando el programa sale en java
- 10. ¿View.removeAllViews() libera memoria?
- 11. ¿Qué sucede con la memoria que no se libera después del final del programa?
- 12. Cuando File.ReadLines libera recursos
- 13. Extracción CAKeyframeAnimation no libera la memoria
- 14. UIImagePickerController no libera la memoria que ocupa
- 15. Delphi - Minimize & Restore libera la memoria?
- 16. ¿Cómo se libera la memoria en xcode 4.2?
- 17. ¿Salir de un pthread libera la memoria mallada?
- 18. La lectura desde la transmisión PackagePart no libera la memoria
- 19. El asignador de Linux no libera trozos pequeños de memoria
- 20. ¿Por qué performGC no libera toda la memoria?
- 21. cuando se lanzará la memoria?
- 22. ¿Hay alguna razón para llamar a eliminar en C++ cuando un programa sale de todos modos?
- 23. MKMapView initWithFrame no libera memoria con ARC
- 24. Matplotlib Python: la memoria no se libera al especificar el tamaño de la figura
- 25. ¿ARC libera memoria malloc'ed para usted?
- 26. El proyecto Cocos2D con muchas escenas no libera memoria correctamente
- 27. Chrome - Detectar cuando el navegador sale
- 28. programa externo de parada cuando el programa Java se detuvo
- 29. ¿Cómo se elimina y libera completamente la memoria de un archivo de sonido OpenAL?
- 30. ¿Cómo sale la salida de este programa a ser esto?
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? –
@Justin: Sin conocer el SO, no creo que esto sea válido. Tal vez explícitamente especifique el sistema operativo del que está hablando. –
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. –