Во втором случае ваш int
-объект уничтожен.В первом случае это не так.
В первом случае вы создаете новый int
-объект с new
во внешней области видимости.Во внутренней области вы создаете второй int
-объект, для которого вы также создаете shared_ptr
, которому затем принадлежит int
-объект.Это shared_ptr
выходит из области видимости при закрытии внутренней области видимости, поэтому оно разрушается.Деструктор shared_ptr
также будет уничтожать объект, к которому он относится, потому что никакой другой shared_ptr
(созданный из исходного) больше не ссылается на ваш объект int
.Все в порядке.Тем не менее, в середине этой области вы переназначаете значение r
на значение *sp
(100).Поэтому вы сохраняете значение *sp
до разрушения sp
в r
.
Примечание: это, безусловно, сомнительный стиль - создавать объект int
так, как вы делаете это в первой строкекода.Если вы явно не удалите этот объект int
, это память.Уничтожить его можно было бы с помощью delete &r
, который выглядит действительно ужасно, особенно потому, что символ r
впоследствии все еще ссылается на теперь удаленный объект int
.НЕ ДЕЛАЙТЕ ЭТОГО!
Во втором случае вы создаете указатель int
в начале, но не объект int
.Внутренняя область видимости почти такая же, как и раньше, за исключением того, что на этот раз вы не сохраняете значение вашего нового объекта int
во внешней области видимости (p
), но сохраняете адрес объекта int
!Поскольку объект int
разрушается в конце внутренней области (по той же причине, что и ранее), p
больше не указывает на существующий объект int
, а на место в памяти, которое ранее когда-то содержало int
объект.Значение, которое вы получаете из *p
, не определено: вы все равно можете получить 100, вы можете получить любое другое значение, и вы можете даже вызвать сбой вашей программы здесь (ошибка сегментации), поскольку вы разыменовываете ячейку памяти, которую вы больше не держите.
Итак, подведем итоги и ответим на последний вопрос:
Ссылка сохраняется, поскольку она все еще ссылается на существующий объект.Указатель этого не делает, поскольку он указывает на более не существующий объект.