Оптимизатор может полностью освободить объект в сценарии 2 в конце оператора, если на obj
нет ссылки позже в блоке.
Весь смысл в том, что оптимизатор может видеть, когда указательссылка, и может выпустить его, как только последняя ссылка будет завершена.obj
не имеет точной семантики времени жизни, поэтому она продлевает жизнь объекта только до последнего обращения к obj
, а не когда obj
выходит из области видимости.
В сценарии 1ссылка не присваивается какой-либо переменной, поэтому она явно не имеет последующих ссылок и может быть немедленно освобождена.Тем не менее, он не может немедленно освободить объект, так как returnMyObj
не передает право собственности вызывающей стороне (из-за его имени).Таким образом, объект не может быть на самом деле освобожден до тех пор, пока не будет истощен пул авто-релиза.