В чем же тогда разница между "new Foo()
" и "&Foo()
"?Очевидно, что оба дают вам указатель на существующий объект типа Foo.
Почему объект, созданный с помощью "new Foo()
", сохраняется после выполнения метода сохранения, тогда как объект, созданный с помощью "&Foo()
", не сохраняется?
new Foo()
new Foo();
Создает динамически размещаемый Foo
объект и возвращает указатель, указывающий на этот объект.Динамически размещенные объекты будут сохраняться до тех пор, пока они явно не будут удалены программистом:
Foo* foo = new Foo();
delete foo; // delete the object.
&Foo()
Foo();
Это создает объект Foo
с использованием автоматическое хранение .Это означает, что его время жизни, когда объект удаляется, определяется областью, в которой он находится:
{
Foo foo{}; // foo lives in automatic storage.
} // end of scope, foo dies
В вашем случае вы создаете новый объект Foo
и передаете адресэтого анонимного объекта на Storage::save
.Этот объект будет уничтожен в конце полного выражения.Это в основном означает, что после s2.save()
возврат вашего объекта будет уничтожен, а указатель, указывающий на него в s2
, будет зависать, и разыменование будет неопределенным поведением.
Если да, то какМогу ли я продлить жизнь объекта, созданного через "& Foo ()", чтобы заставить его жить (по крайней мере) до уничтожения s2?
Вы не можете.Вам, вероятно, нужен интеллектуальный указатель, такой как std::unique_ptr
.
Обратите внимание, что получение временного адреса не является стандартным, и поэтому этот код несовместим с самого начала.Ваш компилятор, вероятно, использует расширение, чтобы разрешить это.MSVC известен тем, что разрешил это.