Sei que o título parece familiar, pois há muitas perguntas semelhantes, mas estou pedindo um aspecto diferente do problema (sei a diferença entre colocar as coisas na pilha e colocá-las na pilha).
Em Java, sempre posso retornar referências a objetos "locais"
public Thing calculateThing() {
Thing thing = new Thing();
// do calculations and modify thing
return thing;
}
Em C ++, para fazer algo semelhante, tenho 2 opções
(1) Eu posso usar referências sempre que precisar "retornar" um objeto
void calculateThing(Thing& thing) {
// do calculations and modify thing
}
Então use assim
Thing thing;
calculateThing(thing);
(2) Ou posso retornar um ponteiro para um objeto alocado dinamicamente
Thing* calculateThing() {
Thing* thing(new Thing());
// do calculations and modify thing
return thing;
}
Então use assim
Thing* thing = calculateThing();
delete thing;
Usando a primeira abordagem, não precisarei liberar memória manualmente, mas para mim isso dificulta a leitura do código. O problema com a segunda abordagem é, vou ter que lembrar delete thing;
, o que não parece muito bom. Eu não quero retornar um valor copiado porque é ineficiente (eu acho), então aqui estão as perguntas
- Existe uma terceira solução (que não requer cópia do valor)?
- Existe algum problema se eu continuar com a primeira solução?
- Quando e por que devo usar a segunda solução?