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()?
Respuesta
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.
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
@Lienau Si quieres un exceso (siempre es bueno :)), puedes usar DoD o Gutmann, pero esos son para tu Disco Duro ... –
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.
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.
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
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);
}
Esto es muy interesante, ¡gracias! – Lienau
- 1. ¿Qué sucede con la memoria que no se libera después del final del programa?
- 2. ¿Qué sucede con la memoria malloc'ed después de que exec() cambie la imagen del programa?
- 3. ¿Qué sucede con el uso de la memoria después de exec *()
- 4. ¿Qué sucede con los punteros a la memoria asignada dinámicamente después de una horquilla UNIX?
- 5. ¿Qué sucede después de capturar un paquete?
- 6. ¿Qué sucede con el atributo view.frame.size después de CGAffineTransform (Rotate)?
- 7. ¿Qué sucede cuando mongodb está sin memoria?
- 8. ASP.NET: ¿Qué sucede con el código después de Response.Redirect (...)?
- 9. ¿Cómo sabe free() cuánta memoria desasignar?
- 10. ¿Qué sucede cuando intenta liberar() la memoria ya liberada en c?
- 11. ¿Qué le sucede a AsyncTasks después de onPause?
- 12. ¿Qué sucede con el código JavaScript después de compilar la aplicación utilizando Titanium Mobile?
- 13. ¿Qué sucede si no llamo a ReleaseBuffer después de GetBuffer?
- 14. ¿Qué sucede con la memoria asignada dinámica cuando se llama a execv()?
- 15. ¿Qué sucede con la memoria asignada por `new` si el constructor lanza?
- 16. ¿Qué sucede con una ventana de WPF después de que se cierra?
- 17. Qué sucede con los espacios de trabajo existentes después de actualizar a TFS 2010
- 18. ¿Qué sucede con un hilo de Android después de que se destruye la actividad que lo creó?
- 19. ¿Qué sucede con el proceso hijo?
- 20. ¿Qué sucede con los comentarios después de compilar los archivos java en Android?
- 21. ¿Qué sucede con el puntero ARCHIVO después de cerrar el archivo?
- 22. ¿Qué sucede en la memoria cuando se crea una instancia de una clase de C++?
- 23. ¿Por qué se asignan objetos Delphi incluso después de llamar a .Free?
- 24. ¿Qué sucede para confirmar los registros en una sucursal después de la fusión?
- 25. ¿Por qué llamar a free() en un puntero asignado con 'nuevo' causa corrupción de montón?
- 26. ¿Qué sucede cuando compilo?
- 27. ¿Qué sucede con los elementos DOM no utilizados?
- 28. restricciones de alineación para malloc()/free()
- 29. ¿Qué sucede con otros hilos cuando un hilo se bifurca()?
- 30. ¿Qué sucede con los miembros de la clase cuando se usa malloc en lugar de nuevo?
¿Qué tiene esto que ver con Windows? ¿Estás preguntando específicamente en Windows? – UpAndAdam