2012-04-19 21 views
13

Decir que tengo el siguiente programaCuando un programa termina ¿qué ocurre con la memoria asignada utilizando malloc que no está libre?

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    int * i; 

    if ((i = malloc(sizeof(int) * 100)) == NULL) { 
     printf("EROOR: unable to allocate memory \n"); 
     return -1; 
    } 

    /* memory is allocated successfully */ 

    /* memory is not free'ed but program terminates */ 
    // free(i); 

    return 0; 
} 

El programa anterior llama malloc para asignar parte de la memoria y no llama free para de-asignarlo. Y el programa termina sin desasignar la memoria.

Valgrind detecta claramente una fuga de memoria.

<snap> 
==14209== HEAP SUMMARY: 
==14209==  in use at exit: 400 bytes in 1 blocks 
==14209== total heap usage: 1 allocs, 0 frees, 400 bytes allocated 
==14209== 
<sanp> 
==14209== LEAK SUMMARY: 
==14209== definitely lost: 400 bytes in 1 blocks 
==14209== indirectly lost: 0 bytes in 0 blocks 
==14209==  possibly lost: 0 bytes in 0 blocks 
==14209== still reachable: 0 bytes in 0 blocks 
==14209==   suppressed: 0 bytes in 0 blocks 
==14209== 
==14209== For counts of detected and suppressed errors, rerun with: -v 
==14209== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0) 

Pregunta:

Cuando el programa termina, lo que ocurre con la memoria que se asignó pero no free 'd?

Actualización: Considere que este código se está ejecutando en un sistema de operación diferente - digamos windows, linux, solarix, macos, etc. ¿Hay alguna diferencia en el comportamiento de este código durante su terminación?

+3

En la mayoría de los sistemas operativos modernos, todos los recursos de los programas se liberan o se cierran. –

+0

¿Puedo preguntarte qué provocó esta pregunta? En lugar de preocuparte por lo que sucede si no lo haces gratis, ¿por qué no te liberas? Entonces puedes dejar de preocuparte; Valgrind sucede, todos están felices. Problema resuelto. –

+0

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

Respuesta

12

Las otras respuestas que dicen las dos cosas importantes:

  1. Sí, la memoria es reclamada por el sistema operativo, por lo que no lo hace técnicamente necesidad de free() ella.
  2. Es una buena práctica liberar todo lo que malloced de todos modos.

Sin embargo, es importante decir qué es una buena práctica a free() todo lo que has malloced. En mi opinión:

  1. Hábito: Si usted consigue en el hábito de liberar cada vez que usted ha malloced, no se le olvide accidentalmente cuando un segmento de memoria no es en torno a la vida del programa.
  2. Maintainable: Si alguien viene a refactorizar su programa para que un segmento de memoria ya no exista durante la vida útil del programa, la presencia del código de limpieza en el original significará que es muy probable que la versión refactorizada también incluye el código de limpieza. Para mí, esta es la razón más importante.
  3. Depuración: Si esperamos que toda la memoria se limpie correctamente, entonces detectar memoria que es en realidad fugas es mucho más fácil.
4

La memoria es recuperada por el sistema operativo una vez que se cierra el programa.
El sistema operativo no comprende que su programa haya filtrado la memoria, simplemente asigna memoria al programa para su ejecución y, una vez que el programa sale, recupera esa memoria.

Sin embargo, otros recursos como los descriptores de archivos pueden/no ser recalificados por el sistema operativo causando una pérdida de recursos.

Por lo tanto, es una buena práctica que un programa limpie todo el recurso que utilizó antes de salir.

7

O.S. reclamará la memoria no liberada.

Pero es una buena práctica para liberar toda la memoria asignada por malloc

+0

que está abierto al debate: http://stackoverflow.com/a/6347182/48015; deshabilitar la desasignación explícita antes de la finalización del programa para las compilaciones de producción es probablemente una buena idea ... – Christoph

1

Cuando un proceso asigna memoria dinámicamente, que toma prestado bloque (s) de memoria del sistema operativo. Cuando un proceso no necesita memoria asignada, se libera (n). Entonces OS agrega esos bloques a su lista libre. Lo mismo ocurre cuando un proceso termina. Todos los bloques utilizados por el proceso son recuperados por el sistema operativo.

Read memory-management for more info.

0

Lo que es más importante, FREE garantiza la cordura de la memoria/búferes asignados por usted, y de ahí en adelante existe un buen punto de control para controlar/recuperar la corrupción del montón.

Cuestiones relacionadas