Несколько объектов std::shared_ptr могут ссылаться на один и тот же указатель благодаря наличию блока управления (control block).
Блок управления, связанный с управляемым объектом, содержит:
shared_ptr для того же объекта. Уменьшается при уничтожении shared_ptr. Когда становится равным нулю, связанный объект (указатель) удаляется.std::weak_ptr. Увеличивается при создании weak_ptr из shared_ptr. Уменьшается при уничтожении weak_ptr. Когда оба счетчика становятся равными нулю, блок управления удаляется.Когда вы создаете shared_ptr из существующего shared_ptr (копирование, присваивание-копирование), они начинают использовать один и тот же блок управления, и счетчик сильных ссылок в этом блоке увеличивается.
Пример:
cpp
Каждый объект shared_ptr содержит свой указатель на блок управления и свой указатель на объект данных. При копировании shared_ptr копируются оба этих указателя, и дополнительно увеличивается счетчик сильных ссылок в общем блоке управления. Таким образом, все shared_ptr указывают на один и тот же блок управления, который отслеживает количество владеющих их копий и определяет момент уничтожения управляемого ресурса.