Оптимизация возвращаемого значения — это частный случай исключения копирования. Это может произойти в следующей ситуации, описанной в стандарте:
в операторе возврата в функции с типом возвращаемого значения класса, когда выражение является именем энергонезависимого автоматического объекта (кроме параметра функции или предложения catch) с тем же типом cv-unqualified, что и тип возвращаемого значения функции, операцию копирования/перемещения можно опустить, встроив автоматический объект непосредственно в возвращаемое значение функции.
Нет причин, по которым это должно привести к утечке памяти. Если класс выполняет некоторое динамическое выделение в своем конструкторе, это произойдет, когда объект создается непосредственно в возвращаемом функцией значении.
В ответ на ваш комментарий (где foo1
и foo2
создают объекты T
и возвращают их):
T a = foo1();
a = foo2();
Здесь мы рассматриваем не только RVO, но и другой вид исключения копии, возникающий при попытке создать объект из временного объекта.
В первой строке можно исключить две копии/хода:
- Возврат построенного объекта из
foo1
- Копирование возвращенного объекта в
a
То есть объект, построенный в foo1
, может быть создан непосредственно в местоположении a
. Если конструктор динамически выделяет некоторый объект, это будет сделано только один раз для объекта a
.
Во второй строке можно исключить одиночное копирование/перемещение - только возврат из функции. Таким образом, объект, который создает foo2
, будет создан непосредственно в возвращаемом значении функции, а затем будет назначено копирование/перемещение в a
. Задания копирования/перемещения не исключаются.
Затем оператор присваивания копирования/перемещения должен гарантировать, что исходный выделенный ресурс будет безопасно удален, а единственным оставшимся ресурсом будет тот, который был создан внутри foo2
.
person
Joseph Mansfield
schedule
17.12.2013
foo1
безопасно применять RVO, но если его применитfoo2
, произойдет утечка динамических ресурсов. - person   schedule 17.12.2013