Я знаю, что название звучит знакомо, так как есть много похожих вопросов, но я спрашиваю о другом аспекте проблемы (я знаю разницу между наличием вещей в стеке и их размещением в куче).
В 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;
, что выглядит не очень хорошо.Я не хочу возвращать скопированное значение, потому что оно неэффективно (я думаю), поэтому здесь возникают вопросы
- Есть ли третье решение (не требующее копирования значения)?
- Есть ли проблема, если я придерживаюсь первого решения?
- Когда и почему я должен использовать второе решение?