PDA

Visualizza la versione completa : [C++]Assegnare un campo di una classe con "una_stringa"


anx721
09-09-2004, 01:48
Ho un dubbio sull'assegnazione di un campo di una classe con un oggetto di tipo char * non allocato con malloc ma come un letterale "xxxxxx", ad esempio:



class A{
const char * value;

A(const char * v){
value = v;
}
}


Quindi in una funzione posso fare:

A * create(){
a = new A("ciao");
return a;
}


Nel costruttore di A inizializzo il campo value con un puntatore a char che č stato inizializzato direttamente nella chiamata del costruttore con la 'stringa' "ciao". Quello che mi chiedo č quale sia il tempo di vita della zona di memoria allocata per "ciao", se cioč "ciao" viene trattato come un array di caratteri allocato staticamente che quindi, essendo una variabile locale viene deallocato all'uscita della funzione create(), oppure continua ad esistere dopo la funzione. Nel primo caso si assegna al campo value l'indirizzo di una zona di memoria non piu valida; ad ogni modo il compilatore non mi segnala problemi, quindi dovrebbe essere giusto, ma voglio essere sicuro.

Ciao e grazie.

Molten
09-09-2004, 12:33
Continua ad esistere ma ci sono dei problemi.
All'interno della funzione create() , e' stato creato un oggetto referenziato dalla variabile "a".
Quando esegui il "return a;" ,viene semplicemente passato l'indirizzo dell'oggetto , la funzione viene terminata ma l'oggetto persiste ancora in memoria perche' e' stato creato nell'heap con "new".
Quindi :

A* create(){
A a = new A("ciao");
return a;
}
l'oggetto non viene distrutto alla terminazione della funzione , ma chi chiama la funzione create() deve sapere e ricordarsi di distruggere l'oggetto referenziato.
Se non si ricorda si crea un memory-leak.

A create(){
A a("ciao");
return a;
}
Invece in questo caso quando la funzione termina , l'oggetto instanziato "a" , viene distrutto , ma prima viene chiamato il costruttore di copia che crea una copia per il return.

anx721
09-09-2004, 15:04
Si questo lo so, la funzione create era solo per esempio, non era questo il problema, quanto sapere se il tempo di vita della variabile "ciao" andava oltre la funzione,

:ciauz:

Molten
09-09-2004, 19:54
La variabile termina di esistere quando esce dallo scope dove e' stata creata.
Ma quello che rappresenta non viene distrutto.

Spero di averti dato una mano...
:ciauz:

Loading