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