¿Cómo 'sabe' free() que el puntero pasado es válido?

Sé que un puntero no válido conduce a un comportamiento indefinido, pero ¿cómo sabe Free si un puntero es válido o no?

¿Hay una especie de suma de verificación al comienzo de cada bloque en la lista libre? algo como:

if((*ptr) == 'CHECKSUM'))
  free
else
  do something undefined

preguntado el 12 de junio de 12 a las 17:06

Por lo general, no lo sabe y simplemente falla (o corrompe algo). -

Encuentre la respuesta a su pregunta aquí stackoverflow.com/questions/1119134/how-do-malloc-and-free-work -

No tiene que saber. El punto es que se permite asumir que el argumento es nulo (en cuyo caso no hace nada) o un puntero a un objeto obtenido por (o como si fuera por) malloc. -

4 Respuestas

Sé que un puntero no válido conduce a un comportamiento indefinido, pero ¿cómo sabe Free si un puntero es válido o no?

La única verificación es si el puntero es nulo o no. Si es un puntero nulo, gratis (por especificación) no hará nada.

De lo contrario, free simplemente intenta "liberar" la memoria, asumiendo que era memoria asignada por malloc, calloc o el realloc, que puede hacer que suceda cualquier cosa (típicamente cosas malas), por lo tanto, "comportamiento indefinido".

Respondido el 12 de junio de 12 a las 17:06

Por eso es una buena idea establecer siempre el puntero en NULL inmediatamente después de haberlo liberado. - Señor lister

Podría haber. Pero en general, no lo hace. Para muchas implementaciones, free simplemente asume que su entrada es válida y sigue adelante como si eso fuera cierto. Está perfectamente en su derecho de hacer eso.

Esta es la razón por la cual el comportamiento es "indefinido": es imposible predecir qué sucederá si el puntero no es válido. Las áreas aleatorias de la memoria pueden quedar destruidas durante la operación de free y/o más tarde cuando se realiza alguna otra operación de almacenamiento dinámico; potencialmente conduce a un comportamiento impredecible en código no relacionado. El programa puede fallar inmediatamente en free, o más tarde en algunos lugares aparentemente no relacionados.

Respondido el 12 de junio de 12 a las 17:06

no sabe Simplemente supone que es válido y actúa apropiadamente.

Si esta suposición fuera incorrecta, podría haber ocurrido la destrucción de estructuras importantes, y lo que sucede entonces no se sabe. De ahí el comportamiento indefinido.

Respondido el 12 de junio de 12 a las 17:06

Como el puntero no es válido, free intenta leer la "información contable" como si el puntero fuera devuelto por malloc y válido, lo que generalmente conduce a la liberación de alguna dirección aleatoria señalada por ese puntero no válido, lo que provoca corrupción/bloqueo, etc.

Respondido el 12 de junio de 12 a las 17:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.