Объект A
будет очищен, как только a
будет удален в конце его блока. Но файл shared_ptr, который он содержит, был впоследствии скопирован, увеличив его счетчик ссылок.
Таким образом, объект B
будет иметь счетчик ссылок 2 после c.setRef
(на который ссылается объект A
и объект C
-объекта shared_ptr
). Когда a
удаляется в конце его блока, то счетчик ссылок B
-объекта снова падает до 1
, так как только c
shared_ptr ссылается на него сейчас.
После того, как c
будет уничтожен в конце main, его shared_ptr
будет также уничтожен как часть уничтожения c
, и теперь, когда счетчик ссылок падает до нуля, указатель на B
объект будет удален shared_ptr
.
Итак, число ссылок объекта B
:
0: before existence of a.
1: from start of lifetime of a until c.setRef
2: from c.setRef until copy of its parameter
3: from copy of c.setRef''s parameter until return of it
2: from return of c.setRef until end of a''s block
1: from end of a''s block until end of main
0: after main returned (object doesn''t exist anymore now)