Newsgroup: it.comp.lang.c++
Titolo: reference a puntatore

Salve a tutti. C'e' qualcosa che mi sfugge nel comportamento del seguente
programma...
*** code start ***
#include <iostream>
using std::cout;
using std::endl;
class Oggetto
{
public:
        Oggetto() {cout << "Costruttore" << endl;}
        ~Oggetto() {cout << "Distruttore" << endl;}
};
Oggetto &byReference()
{
        Oggetto *tmp = new Oggetto();
        return *tmp;
}
void f()
{
        cout << "entering f()" << endl;
        Oggetto o = byReference();
        cout << "exiting f()" << endl;
}
int main()
{
        cout << "Prima" << endl;
        f();
        cout << "Dopo" << endl;
}
*** code end ***
Sembra che l'oggetto "o" venga distrutto all'uscita di f, quando esce dallo
scope, senza che io abbia chiamato delete da nessuna parte. E' questo il
comportamento normale? La regola generale con i reference a pointer
qual'e'?
Grazie in anticipo,
        Teo.
-- 
* Matteo Gottardi | 
mat...@tin.it
* ICQ UIN 20381372
* Linux - the choice of a GNU generation
* GPG Fingerprint:
* B9EE 108F 52C8 D50C B667 B1F2 AB56 8A01 BA3D 36A1

 La regola generale con i reference a pointer qual'e'?
Non c'e' regola generale.
  bye
	av.

 byReference).
Grazie, ho capito l'errore... Dal comportamento del programma mi sembrava
che venisse distrutto l'oggetto creato con il new. Infatti rendendo il copy
constructor privato non compila.


     av.
ciao!

 č un'operazione legale?
Direi di si, anche se stilisticamente non mi piace.
Ovviamente o non e' piu' valido dopo...
  bye
	av.

 "tmp" in "byReference" è un'operazione legale?
Sono d'accordo con Andrea. Mi pare che da un punto di vista *formale* sia 
corretto. Dopo tutto &o è precisamente l'indirizzo di un oggetto allocato 
con una new.
Tuttavia a me non piace per nulla nemmeno il fatto che *dentro* 
byReference allochi un oggetto con new e poi lo restituisci come 
reference.
Non mi piace la byReference, insomma. E' una specie di funzione factory 
sbattuta li e che ti rende dipendente dal *modo* di allocazione interno.
In C++ quando si può si cerca di scrivere codice RAII, ovvero che 
utilizzi il meccanismo di creazione e distruzione delle variabili 
automatiche per aquisire e rilasciare risorse. Questa spiegazione è 
incompleta e intuitiva, senza pretesa di essere rigorosa. 
-- 
  Enrico Franchi (RiK0)
[ Yellow Dog Linux User ]
[ #299188 Linux Counter ]
[ MacOS X User          ]

 con una new.
Grazie per la tua risposta e quella di Andrea.
[...]
ciao!

 reference.
In genere in questi casi la mia preferenza va per gli smart pointer. Del 
tipo:
std::auto_ptr<Oggetto> byReference();
In questo modo il chiamante non deve neanche chiedersi se e come deve 
deallocare il risultato, perche' e' gia' ovvio dalla firma stessa della 
funzione.
  bye
	av.

 che venisse distrutto l'oggetto creato con il new.
Le istanze allocate dinamicamente non vengono MAI distrutte
automaticamente, a meno di non farle gestire a degli smart pointer o
strutture analoge.

 In genere in questi casi la mia preferenza va per gli smart pointer.
Anche la mia. Anche se in generale cerco di fare in modo di non avere 
bisogno nemmeno di quelli.
Ovvero cerco di allocare roba con new solo *dentro* l'implementazione 
privata, quando possibile.
Sfortunatamente molti framework e specialmente quelli grafici non seguono 
questa politica. Il risultato è che scrivere codice strongly-exception 
safe è un bagno di sangua. Ma va bene lo stesso :)
D'altra parte io normalmente suggerisco di *non* arrivare fin sulle GUI 
con C++, per quello che mi riguarda. 


 In genere in questi casi la mia preferenza va per gli smart pointer.
Anche la mia. Anche se in generale cerco di fare in modo di non avere 
bisogno nemmeno di quelli.
Ovvero cerco di allocare roba con new solo *dentro* l'implementazione 
privata, quando possibile.
Sfortunatamente molti framework e specialmente quelli grafici non seguono 
questa politica. Il risultato è che scrivere codice strongly-exception 
safe è un bagno di sangua. Ma va bene lo stesso :)
D'altra parte io normalmente suggerisco di *non* arrivare fin sulle GUI 
con C++, per quello che mi riguarda. 
-- 


 privata, quando possibile.
Ma se hai oggetti complessi da restituire? Come fai?
  bye
	av.

 Ma se hai oggetti complessi da restituire? Come fai?
Se la cosa è praticabile faccio qualcosa con i pimpl.
Se no, faccio come dici.


 Se la cosa è praticabile faccio qualcosa con i pimpl.
Non li conosco (o se li conosco non con quel nome :-).
Cosa sono?
  bye & Thanks
	av.

 Non li conosco (o se li conosco non con quel nome :-).
pimpl = Private IMPLementation / Pointer to IMPLementation
 
http://www.google.it/search?q=pimpl+idiom+c%2B%2B
M

 pimpl = Private IMPLementation / Pointer to IMPLementation
Quello. Aggiungo, spesso legato a qualche meccanismo di ref counting
interno.
-- 
blog:  
http://www.akropolix.net/rik0/blogs
 | Uccidete i filosofi,
site:  
http://www.akropolix.net/rik0/
      | tenetevi riso e
forum: 
http://www.akropolix.net/forum/
     | bacchette per voi.