Schema che illustra un dangling pointer

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.

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

📚 Artikel Terkait di Wikipedia

Pointer

iniziano con o contengono il titolo. Pointer Nunatak – nunatak della Terra di Coats in Antartide Dangling pointer – puntatore che si riferisce ad un'area

Sicurezza rispetto ai tipi

add_int(3, 4.5); ); andare oltre i limiti di un array (out of bound); dangling pointer; invocare o mandare messaggi ad un metodo inesistente di un oggetto;

C sharp

riferimenti a tali oggetti. Questo sistema evita i due problemi dei dangling pointer e del memory leak, anche se con una riduzione delle prestazioni. Come

Ada (linguaggio di programmazione)

oggetti nello stack o creare dangling pointer. Per aumentare la sicurezza si può applicare un pattern di smart pointer, creando oggetti che contano e

Puntatore (programmazione)

sull'argomento informatica sembra trattare argomenti unificabili alla pagina Dangling pointer, che potrebbe confluire qui. Puoi contribuire unendo i contenuti in

Cyclone (linguaggio di programmazione)

inizializzazione degli array prima dell'uso Analisi di regione dei Dangling pointer e uso del free() limitati Consentiti solo casting e union "sicuri"

Garbage collection

di memoria, riducendo o eliminando del tutto alcune categorie di bug: Dangling pointers: persistenza nel programma di puntatori che si riferiscono ad

Holland-Dozier-Holland

as "Edythe Wayne") Chairmen of the Board Kylie Minogue "(You've Got Me) Dangling on a String" (HDH as "Edythe Wayne") Chairmen of the Board "Band of Gold"