Newsgroup: it.comp.lang.c++
Titolo: new, delete e NULL

Salve a tutti,
 ho un piccolo problema col VC 5.0:
supponiamo che ho definito in un file .h la classe MyClass.
Poi ad un certo punto del mio codice scrivo:
MyClass* cl;
e in un altro punto:
if ( cl == NULL ) cl=new MyClass();
e in un altro ancora
if ( cl != NULL ) delete cl;
In altri termini creo un'istanza della classe cl solo se non ne esiste
gia' un'altra.
Allo stesso modo distruggo l'istanza solo se essa esiste (e' stata
creata).
Questo e' quello che vorrei fare. Ma il problema e' che il VC pare non
dia il valore
NULL al puntatore cl quando faccio MyClasse* cl   o quando distruggo
l'istanza con
delete cl.
Faccio notare che quando usavo il compilatore Borland tutto andava bene.
Chi mi aiuta ?
Grazie

...

Purtroppo ho avuto anch'io lo stesso problema e pare proprio che la
soluzione stia
nell'azzerare il puntatore subito dopo la dichiarazione e la delete, in
pratica
MyClass *cl;
cl = 0;    // non NULL ma 0
if (!cl)
  cl = new MyClass;
if (cl) {
   delete cl;
   cl = 0;
}
So che e' una palla ma cosi' ho risolto il problema!!!
Se qualcuno ha qualche altra dritta....
================
       _/
    _/_/_/
     _/
    _/  _/
    _/_/
tec...@login.it
================

nell'azzerare il puntatore subito dopo la dichiarazione e la delete
soluzione corretta, di solito e' buona norma azzerare sempre un
puntatore quando viene dichiarato. Quello che mi stupisce e' che il
Borland si prenda la liberta' di azzerare una variabile non-statica
senza una esplicita inizializzazione. Che io sappia il C++ non prevede
nulla del genere.
Gianpaolo Bottin
- Live Long and Prosper -

 Grazie
Non conosco bene il C++, ma in C sono sicuro che funziona cosi`:
in un solo modulo dovresti definire (ed inizializzare esplicitamente) la
classe con:
MyClass *cl=NULL;
negli altri devi usare:
extern MyClass *cl;
Ripeto: non sono esperto di C++, ma quello che ho descritto funziona
perfettamente in C.
Anzi: chi ne sa di piu` potrebbe giudicare questa proposta?!
Ciao.
-- 
                                                          ,,,
                                                         (0^0)
|--- Giovanni Petrillo ----------------------------- oOO__( )__OOo ---|
|    Italdata S.p.A.                                                  |
|    Software Division (PRS)                Tel: +39 825 621 560      |
|    Nucleo Industriale - Pianodardine      Fax: +39 825 621 501      |
|    83100 Avellino  (ITALY)                                          |
|                                                                     |
|__________ mailto:
Giovanni...@p1.ave1.itd.siemens.net
 _________|
|                                                                     |
  Keep it simple: as simple as possible, but no simpler - A. Einstein

 nulla del genere.
Infatti non č per niente obbligatorio che lo sia. Anzi, su tutti i libri di
programmazione C/C++ che ho letto -e sto leggendo- č SEMPRE fatto presente che
non ci si puň attendere NESSUN valore per le variabili non statiche. In
ambiente UNIX, invece, normalmente anche tutte le variabili globali sono
azzerate in fase di dichiarazione.
Cordialmente,
-- 
Gianni Rondinini, programmer and designer at Pierre s.n.c.
e-mail: 
pie...@mail.asianet.it
homepage: 
http://www.geocities.com/Eureka/Plaza/7153
Red Hat Linux user since 9/25/97
Windows NT Server user since 9/19/97
BREAKFAST.COM
 halted... cereal port not responding!

azzerate in fase di dichiarazione.
ma l'azzeramento delle variabili globali non =E8 una cosa standard, vera =
per ogni compilatore in ogni ambiente?=20
(void*)
ic...@mindless.com
http://www.netcafe.interbusiness.it/users/icaro

...
	>non ci si pu=F2 attendere NESSUN valore per le variabili non
statiche. In
	>ambiente UNIX, invece, normalmente anche tutte le variabili
globali sono
	>azzerate in fase di dichiarazione.
	ma l'azzeramento delle variabili globali non =E8 una cosa
standard, vera per ogni compilatore in ogni ambiente?=20
	=85

essere 0) NON =E8 inizializzata e contiene valori a caso. 
Ora, non so esattamente a cosa vi riferite quando parlate di
'variabili globali' nel discorso che state facendo, ma da come
lo capisco io (e cioe' che le variabili globali hanno static 
storage duration), queste sono inizializzate a zero per default.
Salumi,
--
Marco Danti
Remove NOSPAM from my address before replying - sorry

Alessandro Oddera (
NOSPAM...@unige.it
) wrote:
: Ed e' un vero peccato a mio avviso. Non capisco invece per quale
: motivo si sia deciso che questo non debba essere lo standard, cioe'
: porre a zero tutti i byte della dimensione di una variabile (memset)
: nei compilatori.
Penso che il motivo sia l'efficenza. L'inizializzazione di una variabile
ti potra' sembrare poca cosa, ma se questa viene effettuata molto spesso
potrebbe causare un grosso spreco di tempo (dato che nel 90% dei casi e'
completamente inutile). Oppure pensa ad una dichiarazione di un array molto
grande (magari bidimensionale). L'inizializzazione di una grossa area di
memoria potrebbe essere molto costosa.
Il motivo per cui altri linguaggi effettuano l'inizializzazione delle
variabili e' che hanno scelto di fare un compromesso tra l'efficenza e
altri criteri (come ad esempio la facilita' di programmazione).
: Questo obbliga a scrivere una quantita' di codice
: noioso, inoltre se si accomunano gli azzeramenti con:
: mysz= mychar= myint= mylong= myclass = 0;
: si ottengono warning sul typecasting, qundi bisogna spargere il codice
: su un sacco di righe.
: Non solo, se per abitudine si azzerano tutte le variabili in
: dichiarazione, tipo:
: int myint=0;
: long mylong=0
: e poi magari il codice comincia con un:
: myint= f(x);
Secondo me l'abitudine di azzerare tutte le variabili non e' molto buona,
in quanto molto spesso tale inizializzazione e' inutile.
: noinitializable int myini;
Quest'idea non e' malvagia, anche se forse preferirei una direttiva al
compilatore.
Andrea Polci
apo...@geocities.com