So che il titolo sembra familiare dato che ci sono molte domande simili, ma sto chiedendo un aspetto diverso del problema (conosco la differenza tra avere le cose in pila e metterle in pila).
In Java posso sempre restituire riferimenti ad oggetti "locali"
public Thing calculateThing() {
Thing thing = new Thing();
// do calculations and modify thing
return thing;
}
In C ++, per fare qualcosa di simile ho 2 opzioni
(1) Posso usare i riferimenti ogni volta che devo "restituire" un oggetto
void calculateThing(Thing& thing) {
// do calculations and modify thing
}
Quindi usalo in questo modo
Thing thing;
calculateThing(thing);
(2) Oppure posso restituire un puntatore a un oggetto allocato dinamicamente
Thing* calculateThing() {
Thing* thing(new Thing());
// do calculations and modify thing
return thing;
}
Quindi usalo in questo modo
Thing* thing = calculateThing();
delete thing;
Usando il primo approccio non dovrò liberare memoria manualmente, ma per me rende difficile leggere il codice. Il problema con il secondo approccio è che dovrò ricordarmene delete thing;
, il che non sembra abbastanza carino. Non voglio restituire un valore copiato perché è inefficiente (credo), quindi ecco le domande
- Esiste una terza soluzione (che non richiede la copia del valore)?
- C'è qualche problema se mi attengo alla prima soluzione?
- Quando e perché dovrei usare la seconda soluzione?