In programmazione, un puntatore pendente o dangling pointer è un puntatore che si riferisce ad un'area di memoria non più valida, perché già liberata o perché il puntatore viene utilizzato all'esterno del contesto di esistenza della variabile cui si riferisce.

Schema che illustra un dangling pointer

Poiché il sistema operativo può riassegnare e riutilizzare quella data locazione di memoria, l'utilizzo di un puntatore pendente porta effetti impredicibili, che vanno dall'errore di segmentazione (sistemi UNIX) o errore di protezione generale (sistemi Windows), con conseguente terminazione dell'applicazione che ha causato l'errore, alla corruzione di dati in memoria.[1]

Alcune cause di dangling pointer modifica

Nei linguaggi di programmazione come il C, che prevedono che sia il programmatore ad occuparsi della liberazione della memoria dinamicamente allocata, i puntatori, come tutte le altre variabili, continuano a contenere l'ultimo valore che è stato loro assegnato, anche quando questo valore non è più valido. Quando ad esempio viene liberata la memoria a cui punta un certo puntatore, non è più possibile utilizzarlo senza riassegnarlo ad un'altra area di memoria.

Un esempio è riportato qui sotto:

int *i = (int *) malloc(sizeof(int));

/* ... */

free(i);

*i = 200;  /* a questo punto il valore contenuto in i non si riferisce più
            * ad un'area di memoria valida!
            */

Un'altra causa di dangling pointer, come detto in precedenza, può essere l'utilizzo di un puntatore che si riferisce ad una variabile fuori dal contesto di esistenza (o scope) di quest'ultima.

Ad esempio:

  int *i = NULL;

  {
    int cont = 3;

    i = &cont;

    /* ... */

    *i = 2;    /* equivale a scrivere cont = 2; */
  }

  *i = 200;  /* a questo punto cont non è più una variabile valida,
              * quindi i non si riferisce più ad un'area di memoria valida!
              */

Un ultimo esempio mostra un altro errore (in realtà molto simile al precedente) che frequentemente causa problemi di puntatori pendenti, ovvero il ritornare alla fine di una funzione, l'indirizzo di una variabile locale, non più valida al di fuori della funzione stessa:[2]

  int *ritornaUnInt()
  {
    int cont = 3;

    return &cont;  /* il puntatore a cont non è valido al di fuori di questa funzione! */
  }

Note modifica

  1. ^ Harvey M. Deitel, Paul J. Deitel, C++. Fondamenti di programmazione, Apogeo, 2005.
  2. ^ Paolo Santi, fondamenti di programmazione in C: i puntatori, su wwwold.iit.cnr.it, 22 dicembre 2014. URL consultato il 12:45.

Altri progetti modifica

Collegamenti esterni modifica

  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica