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