2009-06-14 26 views
5

Duplicar posible:
What REALLY happens when you don’t free after malloc?importancia de liberar memoria?

Cuando termina un programa en C/C++, usted tiene que limpiar mediante la liberación de punteros. ¿Qué sucede si no libera la memoria, como si tuviera un puntero a un int y no lo elimina al finalizar el programa? ¿Todavía se usa la memoria y solo se puede liberar reiniciando, o se libera automáticamente cuando finaliza el programa? Y en el último caso, ¿por qué liberarlo si el sistema operativo lo hace por usted?

+1

Duplicado: http://stackoverflow.com/questions/654754/what-really-happens-when-you-dont-free-after-malloc –

+1

Duplicado de esto también: http://stackoverflow.com/questions/ 347338/is-object-releasing-on-program-exit-really-needed/347349 – Tom

Respuesta

5

Cuando finalice su programa, toda la memoria será liberada por el sistema operativo.

La razón por la que debe liberarlo es que la memoria es un recurso limitado dentro de su programa en ejecución. Claro que en programas simples de ejecución muy corta, la falta de memoria libre no tendrá un efecto notorio. Sin embargo, en programas de larga ejecución, si no se libera la memoria, consumirá un recurso finito sin recargarlo. Eventualmente se agotará y su programa se bloqueará groseramente. Es por eso que debes liberar memoria.

+1

Muy bien puesto. La importancia de liberar la memoria no utilizada (y, por supuesto, la implementación de formas que le permiten liberar asignaciones de memoria innecesarias) es fundamental en los programas de larga ejecución. Si está escribiendo una breve tarea corta de trabajo a domicilio, la importancia es de interés académico. Sin embargo, si está escribiendo una gran aplicación (como Firefox, conozco los argumentos, no hay llamas, por favor) y sigue asignando nuevos trozos de memoria y no libera los viejos sin usar, se quedará sin memoria o su aplicación ser expulsado debido a demasiada asignación de recursos. – nik

7

Cuando finaliza el programa, el sistema operativo recupera toda la memoria (liberada o no). Sin embargo, es una buena práctica liberar todo lo que asigna, principalmente para acostumbrarse a él, o en caso de que extienda su programa para que no termine donde solía hacerlo.

+1

Esto es correcto. Para que su programa sea escalable, debe liberar todo tan pronto como sea posible.Esto es ocasionalmente al final del programa, pero por lo general no. –

5

En un sistema operativo de escritorio como Windows, Linux o MacOS, su memoria se limpiará para usted.

En algunos sistemas operativos incorporados o en tiempo real, no se limpiará para usted.

Pero es una buena idea que siempre libere la memoria cuando haya terminado con ella, tenga en cuenta que mientras su programa se está ejecutando, toda esa memoria todavía está en uso. Si no lo libera, el uso de memoria de la máquina aumentará.

También debe tener cuidado con la refactorización, digamos que comienza a escribir una función main() que asigna algo de memoria, y no se molesta en liberarla porque el sistema operativo lo hará por usted. Pero luego mueves ese código a una función que se llama muchas veces, durante un largo período de tiempo; de repente, tienes una gran pérdida de memoria.

1

La memoria es liberada por el sistema operativo al finalizar el programa, pero si todo lo que tiene es una fuga de memoria menor, esa es la menor de sus preocupaciones.

Más problemático es: 1) si ocurre en un bucle, su programa se alarga en tamaño, y 2) en C++, si sus "nuevos" objetos ed no son "eliminar" d, sus destructores no se ejecutan , y esto puede llevar a problemas mucho más graves (pérdida de mutex o pérdida de recursos NO limpiados por el SO, problemas de integridad de datos, la lista continúa)

0

Es importante liberar memoria correctamente para que las herramientas que ayudan encontrará fugas de memoria que tendrán un rendimiento significativo cuando necesite localizar problemas. Permitir que el sistema operativo libere la memoria agregará ruido adicional a las herramientas analíticas que pueda usar más adelante. Incluso si el sistema operativo devuelve la memoria al sistema, debe tener un diseño sólido que utiliza la memoria de forma adecuada y le permite el mejor uso de las herramientas.

Cuestiones relacionadas