Newsgroup: it.comp.lang.c++
Titolo: sugli oggetti temporanei

Salve a tutti,
vorrei se possibile un chiarimento sull'uso degli oggetti temporanei in 
C++, perchè essendo abituato a java come linguaggio OO ho un dubbio che 
vorrei togliermi.
Supponiamo di avere una classe Oggetto con una funzione membro con il 
seguente prototipo:
fai_qualcosa(string*);
se io ora faccio:
Oggetto i(parametri costruttore);
i.fai_qualcosa(new string("la mia stringa"));
questa sintassi è molto usata in java, poichè la distruzione degli 
oggetti è delegata al garbage collector e l'utente può ignorarla.
Ma quello che sto facendo è passare alla funzione un oggetto temporaneo 
per il quale io non ho un puntatore esplicito su cui fare una successiva 
delete; non potendo supporre che il delete della stringa sia fatto 
all'interno della funzione membro fai_qualcosa(), in questo modo 
introdurrei un memory leak giusto?
Quindi tale sintassi non è da usarsi in C++, giusto?
Saluti e grazie, Alberto

 Quindi tale sintassi non è da usarsi in C++, giusto?
Non è una questione di sintassi. Nel caso in questione, giacché non nessuno 
invocherà 'delete' sul puntatore restituito da 'new', non puoi permetterti 
di perderne traccia. Ci possono, però, essere casi in cui quel, diciamo, 
"idioma" è perfettamente accettabile. E lo sarebbe, in effetti, se 
'fai_qualcosa()' richiedesse un oggetto allocato dinamicamente e garantisse 
la sua successiva distruzione con 'delete'.
In generale, ogni volta che usi 'new', devi sapere come e quando verrà 
invocato 'delete'. Inoltre, 'delete' dovrà essere chiamato una e una sola 
volta. Chiamare 'delete' due volte sullo stesso puntatore è un errore e ha 
conseguenze non definite.
Nota terminologica: nel gergo del C++ gli oggetti allocati dinamicamente 
non sono chiamati "temporanei". Il termine "temporaneo" si riferisce a un 
particolare tipo di oggetto automatico il cui lifetime è limitato (salvo 
un'eccezione che per semplicità trascuriamo) all'espressione in cui viene 
instanziato. Es:
 void fai_qualcosa( const std::string & str );
 
   fai_qualosa(  std::string("ciao") ); 
        // la funzione riceve un riferimento al temporaneo std::string
 
   fai_qualosa( "ciao" ); 
       // qui un temporaneo viene implicitamente creato tramite il
       // costruttore appropriato di std::string
 
Max

 Quindi tale sintassi non è da usarsi in C++, giusto?
giusto, pur essendo lecito usarlo e assolutamente compilabile. se invochi 
una new senza il corrispettivo delete, la memoria allocata rimane li fino 
alla fine del processo, con ovvi problemi :)
ma in c++ puoi usare la stessa comodità con una modifica ridicola
Oggetto i(parametri costruttore);
i.fai_qualcosa(string("la mia stringa"));
come vedi, si toglie in "new" e tutto funziona come vorresti
il compilatore crea un oggetto temporaneo 'string' nello stack e non 
nell'heap, viene passato come parametro a fai_qualcosa(), viene usato, e 
al termine del metodo viene distrutto e cancellato dallo stack.
l'unica limitazione credo sia quando il metodo prende un oggetto per 
riferimento. in questo caso lo standard c++ non ritiene lecito fare cosi, 
anche se buona parte dei compilatori lo fa senza problemi...

 Ma quello che sto facendo č passare alla funzione un oggetto temporaneo [...]
Un oggetto creato con new ha ben poco di temporaneo.
Il /puntatore/ č temporaneo, non l'oggetto puntato!
Kiuhnm

 Quindi tale sintassi non è da usarsi in C++, giusto?
si cosi' introduci un memory leak e tra parentesi non e' questo che si
chiama oggetto temporaneo in C++ !
i.fai_qualcosa(std::string("la mia stringa"));
ora hai un oggetto temporaneo e ora non hai alcun leak.
Tommaso
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Quindi tale sintassi non è da usarsi in C++, giusto?
Quasi mai per gli ogetti a semantica di valore.
--
James Kanze (GABI Software)             
email:james...@gmail.com
Conseils en informatique orientée objet/
                   Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, 
+33 (0)1 30 23 00 34

Grazie a tutti per le risposte, e per avermi fatto giustamente notare 
che ho usato impropriamente l'aggettivo "temporaneo".
Saluti, Alberto