Newsgroup: it.comp.lang.c++
Titolo: Impostare un puntatore a NULL

Ciao a tutti!
Scaricando degli esempi da Internet, ho visto che spesso, dopo aver
cancellato un puntatore con delete, il puntatore si imposta uguale a NULL,
ad esempio:
delete temp;    //temp è un char*
temp = NULL;
Serve veramente impostare il puntatore a NULL dopo che è stato cancellato?
Grazie, Riccardo

 Serve veramente impostare il puntatore a NULL dopo che è stato cancellato?
In teoria, no. Non impostando a NULL il puntatore, esso avra' ancora un
qualche valore ma ovviamente il blocco di memoria che era allocato a
quell'indirizzo "non esiste piu'". Ovviamente devi essere sicuro tu che dopo
la delete non userai piu' quel puntatore !

 la delete non userai piu' quel puntatore !
Il vantaggio di imporlo a NULL è duplice:
delete NULL è sempre valida, inoltre
int *p = NULL;
*p = 5;
Su un sistema a memoria protetta ti darà errore e ti crasherà sulla corretta
linea. Se invece tu scrivi su memoria già "deletata" il 99% delle volte
ottieni errori random in punti random.
--- bye


wrote:

ricordo di aver letto da qualche parte che è meglio non usare la
costante NULL, ma scrivere direttamente 0... mi confermi questa cosa?
-- 
]\/[ad]\/[age (
www.mindreamz.net
)
"Un Maestro insegue semplicemente la sua visione di Eccellenza in
qualunque cosa sta facendo e lascia agli altri decidere se sta 
lavorando o giocando. A lui sembra sempre di fare entrambe." - Anonimo

 costante NULL, ma scrivere direttamente 0... mi confermi questa cosa?
Io sapevo l'esatto opposto: NULL non č garantito che sia 0, ma sui sistemi
in cui č possibile, la memoria puntata da NULL dev'essere "invalida" (non
leggibile e/o scrivibile)
(ma alla fin fine sul 99,99% dei sistemi NULL = 0).
--- bye

 costante NULL, ma scrivere direttamente 0... mi confermi questa cosa?
L'uso direttamente di 0 in C++, per invalidare un puntatore, e' 
sconsigliato perche' il compilatore,  ha un controllo sui tipi piu' 
stretto. Anche una macro NULL definita come
#define NULL 0L
presenta gli stessi inconvenienti in C++
In C++ sarebbe opportuno definire NULL come
const int NULL = 0;
come suggerito nel libro "The C++ Programming Language" di Stroustrup.
NULL non e' nello standard C++ (qualcuno mi corregga se sbaglio) ma e' 
molto popolare cosi' ogni vendor di un compilatore lo inserisce negli 
header standard. Guarda nel manuale del tuo compilatore per vedere come 
implementa NULL.
-- 
Spero ti aiuti.
====
Giovanni Trematerra

In C++ la cosa più sana è scrivere:
puntatore = 0;
I dettagli sono nel libro di Stroustrup al paragrafo 5.1.1
Tra le proposte di estensione del C++ c'è la costante speciale nullptr
E' probabile che l'avremo tra qualche anno

 come suggerito nel libro "The C++ Programming Language" di Stroustrup.
Evidentemente non hai capito e... hai problemi con l'inglese....
Il libro dice il contrario, che NULL e' sconsigliato e che 0 da meno
problemi (a causa del controllo piu' stretto sui tipi).
Dice che in C era comune usare NULL (e consigliato), ora in C++ e'
preferibile usare 0.
Se uno proprio sentisse il bisogno di usare NULL allora dovrebbe definirlo
come:
const int NULL = 0; e non con una macro (define) come in C.
Tommy

 
Mi scuso per l'informazione sbagliata che ho dato.
Tommy spero che mi sia rimasto ancora un briciolo di intelligenza per 
comprendere le cose! Hai assolutamente ragione per l'inglese :)
====
Gianni

  in this International Standard (_conv.ptr_).1)
Piuttosto, mi sono sempre chiesto perche' non abbiano fatto in modo che
delete metta automaticamente a NULL/0 il puntatore che gli si passa.
Per efficienza? Solo perche' non strettamente necessario? Altri motivi
che mi sfuggono?
E se eventualmente un implementazione lo facesse (magari solo in debug e
non in release) sarebbe fuori standard?
 bye & Thanks
	av.

 const int NULL = 0; e non con una macro (define) come in C.
Questo non mi pare sensato, dal momento che 0 rappresenta *sia* un
intero, *sia* il valore nullo di qualsiasi tipo di puntatore. E' pero'
una rappresentazione sintattica che interviene a monte del sistema dei
tipi. Forzare la costante a int e' fuorviante e impone una
conversione, anche se a costo zero.
Ciao,
Nicola

...

Errore. In C++ a livello di linguaggio NULL e' uguale a 0 per
definizione. E' la rappresentazione interna che potrebbe non essere
composta di byte tutti a zero, ma questo, a meno di cast contro
natura, e' trasparente.
Ciao,
Nicola

 che mi sfuggono?
forse perchè a delete puoi passare anche un puntatore const.
-- 
Nuoto e me ne frego!


Non ci avevo pensato.
 bye & Thanks
	av.

 conversione, anche se a costo zero.
ripeto, ho semplicemente tradotto lo Strostrup.
a questo punto riporto:
<QUOTE>
In C, it has been popular to define a macro NULL to represent the zero
pointer. Because of C++'s tighter type checking, the use of plain 0, rather
than any suggested NULL macro, leads to fewer problems. If you feel you must
define NULL, use
const int NULL = 0;
</QUOTE>
Come ti accorgerai il mio messaggio che hai contestato non e' altro che la
traduzione di questo pezzo dello Stroustrup.
Se hai dei problemi con quello che dice Bjarne puoi sempre spedirgli una
mail, a quanto pare spesso risponde.
Tommy

personalmente ho un solo problema sull'utilizzo di 0 al posto di NULL:
quello della leggibilità, se vedo a = NULL so che a è un puntatore, se
leggo a = 0, non so se è un puntatore o un intero o che altro
ma il discorso sul type checking non fa una grinza


 non in release) sarebbe fuori standard?
Due problemi: intanto questo richiederebbe che il parametro fosse
passato a delete per reference non const, ma soprattutto sarebbe
fuorviante, perche' di un puntatore possono esistere infinite copie, e
solo quella esplicitamente passata a delete sarebbe azzerata. Anche
per questo mi pare poco utile impostare a zero un puntatore dopo
delete. Piuttosto sarebbe meglio utilizzare un opportuno smart
pointer.
Ciao,
Nicola