Sé que el título suena familiar ya que hay muchas preguntas similares, pero estoy pidiendo un aspecto diferente del problema (sé la diferencia entre tener cosas en la pila y ponerlas en el montón).
En Java siempre puedo devolver referencias a objetos "locales"
public Thing calculateThing() {
Thing thing = new Thing();
// do calculations and modify thing
return thing;
}
En C ++, para hacer algo similar tengo 2 opciones
(1) Puedo usar referencias siempre que necesite "devolver" un objeto
void calculateThing(Thing& thing) {
// do calculations and modify thing
}
Entonces úsalo así
Thing thing;
calculateThing(thing);
(2) O puedo devolver un puntero a un objeto asignado dinámicamente
Thing* calculateThing() {
Thing* thing(new Thing());
// do calculations and modify thing
return thing;
}
Entonces úsalo así
Thing* thing = calculateThing();
delete thing;
Usando el primer enfoque, no tendré que liberar memoria manualmente, pero para mí hace que el código sea difícil de leer. El problema con el segundo enfoque es que tendré que recordarlo delete thing;
, lo que no se ve muy bien. No quiero devolver un valor copiado porque es ineficiente (creo), así que aquí vienen las preguntas
- ¿Hay una tercera solución (que no requiera copiar el valor)?
- ¿Hay algún problema si me quedo con la primera solución?
- ¿Cuándo y por qué debería usar la segunda solución?