Ich weiß, dass der Titel bekannt vorkommt, da es viele ähnliche Fragen gibt, aber ich frage nach einem anderen Aspekt des Problems (ich kenne den Unterschied zwischen dem Ablegen von Dingen auf dem Stapel und dem Ablegen auf dem Haufen).
In Java kann ich immer Verweise auf "lokale" Objekte zurückgeben
public Thing calculateThing() {
Thing thing = new Thing();
// do calculations and modify thing
return thing;
}
In C ++ habe ich zwei Möglichkeiten, um etwas Ähnliches zu tun
(1) Ich kann Referenzen verwenden, wenn ich ein Objekt "zurückgeben" muss
void calculateThing(Thing& thing) {
// do calculations and modify thing
}
Dann benutze es so
Thing thing;
calculateThing(thing);
(2) Oder ich kann einen Zeiger auf ein dynamisch zugewiesenes Objekt zurückgeben
Thing* calculateThing() {
Thing* thing(new Thing());
// do calculations and modify thing
return thing;
}
Dann benutze es so
Thing* thing = calculateThing();
delete thing;
Mit dem ersten Ansatz muss ich den Speicher nicht manuell freigeben, aber für mich ist der Code schwer zu lesen. Das Problem mit dem zweiten Ansatz ist, dass ich mich daran erinnern muss delete thing;
, was nicht ganz gut aussieht. Ich möchte keinen kopierten Wert zurückgeben, weil er ineffizient ist (glaube ich). Hier kommen die Fragen
- Gibt es eine dritte Lösung (für die kein Kopieren des Werts erforderlich ist)?
- Gibt es ein Problem, wenn ich mich an die erste Lösung halte?
- Wann und warum sollte ich die zweite Lösung verwenden?