UC3M

Grado en Ing. Telemática/Sist. Audiovisuales/Sist. de Comunicaciones

Arquitectura de Sistemas

Septiembre 2017 - Enero 2018

6.10.5. Acceso a memoria con un puntero corrupto

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.