Cuando la memoria dinámica se reserva, el sistema marca esa porción como ocupada y por tanto sus datos se mantienen. Sin embargo, cuando la memoria se libera, su contenido ya no está garantizado, y depende del uso interno que de ella haga el sistema operativo.
Esta observación es importante porque la función
free
que recibe como parámetro un puntero, libera su contenido
pero no evita que se pueda volver a acceder a él, en lo que se conoce como
un problema de acceso a un “puntero corrupto”. La siguiente
porción de código muestra un ejemplo de este problema.
struct list_element { int; struct list_element *next; }; void destroy(struct list_element *l) { while (l != NULL) { free(l); l = l->next; } return; }
La línea que avanza por la cadena de punteros l = l
->next
accede a una porción de memoria apuntada por l
que ha sido liberada previamente, por lo tanto, su contenido no está
garantizado y puede que el campo next
ya no contenga el dato
esperado. Una forma de resolver este problema es copiar ese puntero en un
lugar en el que no pase esto, por ejemplo, una variable local.