Я знаю, что название звучит знакомо, так как есть много похожих вопросов, но я прошу о другом аспекте проблемы (я знаю разницу между наличием вещей в стеке и помещением их в кучу).
В Java я всегда могу возвращать ссылки на "локальные" объекты
public Thing calculateThing() {
Thing thing = new Thing();
// do calculations and modify thing
return thing;
}
В С++, чтобы сделать что-то подобное, у меня есть 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;
, что выглядит не совсем красиво. Я не хочу возвращать скопированное значение, потому что он неэффективен (я думаю), поэтому приходят вопросы
- Есть ли третье решение (которое не требует копирования значения)?
- Есть ли какие-либо проблемы, если я придерживаюсь первого решения?
- Когда и почему я должен использовать второе решение?