Wiem, że tytuł brzmi znajomo, ponieważ jest wiele podobnych pytań, ale proszę o inny aspekt problemu (znam różnicę między posiadaniem rzeczy na stosie a układaniem ich na stosie).
W Javie zawsze mogę zwrócić odniesienia do obiektów „lokalnych”
public Thing calculateThing() {
Thing thing = new Thing();
// do calculations and modify thing
return thing;
}
W C ++, aby zrobić coś podobnego, mam 2 opcje
(1) Mogę używać referencji, gdy potrzebuję „zwrócić” obiekt
void calculateThing(Thing& thing) {
// do calculations and modify thing
}
Następnie użyj tego w ten sposób
Thing thing;
calculateThing(thing);
(2) Lub mogę zwrócić wskaźnik do dynamicznie przydzielonego obiektu
Thing* calculateThing() {
Thing* thing(new Thing());
// do calculations and modify thing
return thing;
}
Następnie użyj tego w ten sposób
Thing* thing = calculateThing();
delete thing;
Korzystając z pierwszego podejścia, nie będę musiał ręcznie zwalniać pamięci, ale dla mnie utrudnia to odczytanie kodu. Problem z drugim podejściem polega na tym, że będę musiał pamiętać delete thing;
, co nie wygląda całkiem ładnie. Nie chcę zwracać skopiowanej wartości, ponieważ jest nieefektywna (tak mi się wydaje), więc oto pytania
- Czy istnieje trzecie rozwiązanie (które nie wymaga kopiowania wartości)?
- Czy jest jakiś problem, jeśli będę trzymać się pierwszego rozwiązania?
- Kiedy i dlaczego powinienem skorzystać z drugiego rozwiązania?