¿Qué sucede con los datos que están presentes en una ubicación de memoria que acaba de ser liberada por un free()
? ¿Esos datos también se eliminan y la memoria ahora tendrá un valor de basura? ¿O esos datos aún persisten allí hasta que se almacenan nuevos datos en esa ubicación de memoria (en el futuro)?
Quiero decir, para el código a continuación:
int *ptr;
ptr = malloc(sizeof(int));
*ptr = 1;
// Suppose ptr = 2000
//Free now
free(ptr);
// My question is what is the value stored in memory address 2000 now ?
// Is it still '1' or some garbage value ?
El resultado es impredecible. Hay varias opciones que pueden suceder. El punto es que no puedes confiar en ningún comportamiento de la memoria liberada por free()
Algunos ejemplos:
- la memoria puede estar intacta (permanecer igual que está con los mismos datos).
- Se puede asignar a otra asignación de memoria, en cuyo caso se puede sobrescribir en cualquier momento.
- Se puede poner a cero.
- La página que contiene la memoria se puede devolver al sistema operativo, eliminándola del mapa de memoria de su proceso, haciendo que su programa se bloquee si intenta acceder a ella.
No se define si el valor se sobrescribe o no. Una vez free
se le permite dejar la memoria como está o puede sobrescribirla, pero si está interesado en la seguridad, debe sobrescribirla usted mismo antes de desasignarla. Hablando de desasignación, free
no tiene que devolver la memoria al sistema operativo y, de hecho, en muchos casos no lo hará, sino que mantendrá la memoria asignada a su programa para que la próxima vez que llame malloc
simplemente puede devolverle la misma memoria y evitar tener que hacer más llamadas al sistema, ya que el tiempo que toma la asignación de memoria del sistema operativo generalmente se considera un uso menos eficiente de los recursos que el programa que mantiene un poco más de memoria asignada. necesidades.

Señor jo negro
¡Sé que usando la función C free() se libera la memoria utilizada, pero no se modifica ni el puntero ni el valor contenido en la memoria! free() solo dice que la memoria puede usarse para otros fines. (Puede que algunas implementaciones de bibliotecas limpien la memoria liberada o el valor del puntero, ¡pero esto no debería ser el estándar!)
Probé el siguiente código con gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
int main(void)
{
int *i,j;
i=malloc(100*sizeof(int));
for(j=0;j<100;j++)
i[j]=j+1;
printf("%p %d\n",i,i[0]);
free(i);
printf("%p %d\n",i,i[0]);
return 0;
}
Los resultados de salida (como esperaba) son:
0x1de2010 1
0x1de2010 1
Malloc() es una función de biblioteca. La respuesta depende de cómo se implemente la biblioteca.
La mayoría (si no todos) los mallocs anteponen un encabezado al bloque de memoria devuelto. Esto generalmente se modifica.
Algunos mallocs añaden un tráiler al bloque de memoria y le escriben algo. Esto se utiliza para detectar desbordamientos de búfer.
Algunos frees() sobrescribirán la escritura de la memoria devuelta con algún patrón de bits para detectar escrituras posteriores.
Hay muchos mallocs que puede descargar y vincular con su aplicación para que pueda obtener casi cualquier comportamiento que desee al vincular el malloc que desea con su aplicación.

rabi shaw
Depende del compilador. Si está utilizando gcc, después de que el valor libre de esa memoria se convierta en 0.
Aquí hay un código de muestra:
#include<stdio.h>
#include<stdlib.h>
int main ( void )
{
int *ptr = NULL;
ptr = malloc (sizeof(int));
*ptr = 5;
printf ( "\n value of *ptr = %d", *ptr );
free ( ptr );
printf ( "\n value of *ptr = %d", *ptr );
return ( 0 );
}
o/p:
./a.out
value of *ptr = 5
value of *ptr = 0
./a.out
value of *ptr = 5
value of *ptr = 0
./a.out
value of *ptr = 5
value of *ptr = 0

coronel treinta y dos
Desreferenciar un free
El puntero d conduce a un comportamiento indefinido, lo que significa que se permite que suceda cualquier cosa.
Lo más probable es que obtenga un valor de basura, pero también puede desencadenar una falla de segmentación, lo que bloqueará su programa. Aun así, ninguno de esos comportamientos está garantizado y no debe confiar en ellos.
La norma no especifica eso. Sólo dice que algunos usos de
ptr
después de la llamada afree
es un comportamiento indefinido.– R Sahu
12 de abril de 2015 a las 4:55
Ambos escenarios que mencionó son posibles entre muchos otros, incluido el acceso a los datos a través de ese puntero, lo que resulta en una falla de segmentación. Es un comportamiento indefinido (UB). Déjalo ir
– chux – Reincorporar a Monica
12 de abril de 2015 a las 4:56