Я знаю, що заголовок звучить звично, оскільки є багато подібних запитань, але я прошу іншого аспекту проблеми (я знаю різницю між тим, що мати речі на стеку та ставити їх у купу).
На Java я завжди можу повертати посилання на "локальні" об'єкти
public Thing calculateThing() {
Thing thing = new Thing();
// do calculations and modify thing
return thing;
}
У C ++, щоб зробити щось подібне, у мене є 2 варіанти
(1) Я можу використовувати посилання, коли мені потрібно "повернути" об'єкт
void calculateThing(Thing& thing) {
// do calculations and modify thing
}
Тоді використовуйте його так
Thing thing;
calculateThing(thing);
(2) Або я можу повернути вказівник на динамічно виділений об'єкт
Thing* calculateThing() {
Thing* thing(new Thing());
// do calculations and modify thing
return thing;
}
Тоді використовуйте його так
Thing* thing = calculateThing();
delete thing;
Використовуючи перший підхід, мені не доведеться звільняти пам'ять вручну, але мені це ускладнює читання коду. Проблема другого підходу полягає в тому, що мені доведеться пам’ятати delete thing;
, що виглядає не дуже добре. Я не хочу повертати скопійоване значення, оскільки воно неефективне (я думаю), тому тут виникають питання
- Чи є третє рішення (для якого не потрібно копіювати значення)?
- Чи є якась проблема, якщо я дотримуюся першого рішення?
- Коли і чому я повинен використовувати друге рішення?