Sei sulla pagina 1di 2

inizializzazione di una variabile puntatore

17 marzo 2006

Marco Altese

Anche per le variabili puntatore esiste la possibilit di ricorrere allinizializzazione nel momento della loro definizione. Ad esempio:
i n tx ; i n t *p _ x=&x ; c h a rc; c h a r *p _ c=&c ;

Il C++ mette a disposizione un tipo particolare di inizializzazione di un puntatore. Infatti possibile, ed anzi buona norma farlo, inizializzare una variabile puntatore a NULL (ovvero non la si fa puntare a nessun indirizzo di memoria) . Ad esempio:
i n t *p _ x=N U L L ; c h a r *p _ c=N U L L ;

Quando per si inizializza un puntatore a NULL, si deve tener presente che non possible in alcun modo utilizzare la variabile puntatore per nessuna operazione finch non la si inizializzi con un indirizzo valido. Infatti, se provassimo a scrivere:
i n t *p _ x=N U L L ; c o u t< <* p _ x< <e n d l ; / /E r r o r e ! !

otterremmo un errore in esecuzione in quanto la variabile puntatore p_x non punta nessuna variabile intera che contenga un valore valido. Occorrer far puntare p_x ad una variabile intera:
i n tx=2 0 ; i n t *p _ x=N U L L ; p _ x=&x ; c o u t< <* p _ x< <e n d l ; / /A d e s s oc o r r e t t o

Esiste ancora unaltra possibilit per inizializzare una variabile puntatore: utilizzando loperatore new messo a disposizione dal C++. Quando si scrive:
i n tx=2 0 ; i n t *p _ x=N U L L ; p _ x=n e wi n t ; * p _ x=x ;

quello che si ottiene un risultato apparentemente simile a quello visto negli esempi precedenti, ma in realt abbastanza diverso. Listruzione:
p _ x=n e wi n t

altro non fa che allocare una quantit di memoria necessaria per contenere un int (ovvero 2 byte) ed assegnare lindirizzo del primo byte di memoria alla variabile p_x. Questo indirizzo certamente diverso da quello in cui contenuta la variabile x stessa, per cui in tal caso avremo in realt due variabili intere differenti che contengono lo stesso valore. E anche possibile usare listruzione:
p _ x=n e wi n t ( 2 0 ) ;

per inizializzare direttamente il valore *p_x a 20. Si faccia ora attenzione. Abbiamo detto che le variabili puntatore fanno riferimento alla memoria dinamica (heap). Diversamente dalla memoria statica, tutte le variabili puntatore allocate dal programmatore devono essere poi distrutte quando non servono pi, per evitare i cosdetti memory leaks, ovvero per evitare che la memoria allocata resti tale anche dopo la terminazione del programma. Listruzione del C++ che serve per distruggere una variabile puntatore : delete . Nel caso dellesempio precedente, avremmo:
i n tx=2 0 ; i n t *p _ x=N U L L ; p _ x=n e wi n t ; * p _ x=x ; d e l e t ep _ x ; / /L av a r i a b i l ep _ xn o ns e r v ep i .P o s s i a m od e a l l o c a r l a

Per capire cosa un memory leak, vediamo lesempio seguente:


i n tx=2 0 ; i n t *p _ x=N U L L ; p _ x=n e wi n t ; p _ x=&x ;/ /A t t e n z i o n e ! !M e m o r yl e a k ! ! * p _ x=2 0 ;

Perch quando si esegue listruzione p_x = new int si sta creando un memory leak? La risposta semplice. La variabile p_x stata innanzitutto inizializzata utilizzando listruzione p_x = new int. Tale istruzione ha fatto s che venissero allocati due byte ed assegnato lindirizzo del primo di questi byte alla variabile p_x. Quando poi si esegue listruzione p_x = & x la variabile p_x viene fatta puntare allindirizzo in cui contenuta la variabile x ma in nessun modo viene deallocata la memoria che era stata allocata in precedenza. Questo causa il famoso memory leak. Bisogna stare molto attenti ai memory leak. Spesso non sono semplici da riconoscere e possono causare problemi ai programmi causando una graduale diminuzione delle risorse di sistema. Per evitare il memory leak di prima avremmo dovuto scrivere:
i n tx=2 0 ; i n t *p _ x=N U L L ; p _ x=n e wi n t ; d e l e t ep _ x ;/ /D e a l l o c a z i o n ed e l l am e m o r i aa l l o c a t ad ap _ x p _ x=&x ;/ /C o r r e t t o ! * p _ x=2 0 ;

Lezione:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52