2011-02-26 16 views
5

Sé que en su disco duro, si elimina un archivo, los datos no desaparecen (instantáneamente). La información está allí hasta que se sobrescribe. Me preguntaba si existía un concepto similar en la memoria. Digamos que asignó 256 bytes para una cadena, ¿esa cadena sigue flotando en la memoria en alguna parte después de I free() hasta que se sobrescribe?¿Qué sucede con la memoria después de free()?

+0

¿Qué tiene esto que ver con Windows? ¿Estás preguntando específicamente en Windows? – UpAndAdam

Respuesta

5

Generalmente, se mantiene, a menos que sobrescriba explícitamente la cadena antes de free ing it (como las personas a veces lo hacen con contraseñas). Algunas implementaciones de bibliotecas sobrescriben automáticamente la memoria desasignada para capturar los accesos a ella, pero eso no se hace en el modo de lanzamiento.

+0

Eso es lo que pensé, supongo que debería usar ZeroMemory antes de 'free()' para evitar que se lea después de la desasignación. Gracias. – Lienau

+1

@Lienau Si quieres un exceso (siempre es bueno :)), puedes usar DoD o Gutmann, pero esos son para tu Disco Duro ... –

3

Su analogía es correcta. Los datos en la memoria no desaparecen ni nada por el estilo; los valores pueden de hecho seguir allí después de free(), aunque intentar leer desde la memoria liberada es un comportamiento indefinido.

3

La respuesta depende en gran medida de la implementación. En una buena implementación, es probable que al menos el comienzo (o el final?) De la memoria se sobrescriba con la información de contabilidad para rastrear trozos de memoria libres que luego podrían reutilizarse. Sin embargo, los detalles variarán. Si su programa tiene algún nivel de simultaneidad/subprocesos (incluso en la implementación de la biblioteca puede que no lo vea), dicha memoria podría ser eliminada asincrónicamente, tal vez incluso de tal manera que incluso leerla sea peligroso. Y, por supuesto, la implementación de free podría desasignar por completo el rango de direcciones del espacio de direcciones virtuales del programa, en cuyo caso intentar hacer algo con él bloqueará su programa.

Desde el punto de vista de un autor de la aplicación, simplemente debe tratar free según la especificación y nunca acceder a la memoria liberada. Pero desde el punto de vista de un implementador o integrador de sistemas, podría ser útil conocer (o diseñar) la implementación, en cuyo caso su pregunta es interesante.

+0

Realmente no tengo ninguna intención de leer mi memoria desasignada como pensaba lo mismo sobre la incertidumbre y la inestabilidad. La pregunta es solo por curiosidad. – Lienau

2

Si desea verificar el comportamiento de su implementación, el sencillo programa siguiente lo hará por usted.

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

/* The number of memory bytes to test */ 
#define MEM_TEST_SIZE 256 

void outputMem(unsigned char *mem, int length) 
{ 
    int i; 

    for (i = 0; i < length; i++) { 
     printf("[%02d]", mem[i]); 
    } 
} 

int bytesChanged(unsigned char *mem, int length) 
{ 
    int i; 
    int count = 0; 

    for (i = 0; i < MEM_TEST_SIZE; i++) { 
     if (mem[i] != i % 256) 
      count++; 
    } 
    return count; 
} 

main(void) 
{ 
    int i; 
    unsigned char *mem = (unsigned char *)malloc(MEM_TEST_SIZE); 

    /* Fill memory with bytes */ 
    for (i = 0; i < MEM_TEST_SIZE; i++) { 
     mem[i] = i % 256; 
    } 

    printf("After malloc and copy to new mem location\n"); 
    printf("mem = %ld\n", mem); 
    printf("Contents of mem: "); 
    outputMem(mem, MEM_TEST_SIZE); 

    free(mem); 
    printf("\n\nAfter free()\n"); 
    printf("mem = %ld\n", mem); 
    printf("Bytes changed in memory = %d\n", bytesChanged(mem, MEM_TEST_SIZE)); 
    printf("Contents of mem: "); 
    outputMem(mem, MEM_TEST_SIZE); 


} 
+0

Esto es muy interesante, ¡gracias! – Lienau

Cuestiones relacionadas