shared_ptr использует внутренний управляющий блок (control block), который содержит счетчик сильных ссылок (strong count) и счетчик слабых ссылок (weak count).
Механизм работы:
shared_ptr, указывающего на объект, создается управляющий блок с обоими счетчиками, инициализированными в 1.
c
shared_ptr: При копировании shared_ptr увеличивается strong_count в том же управляющем блоке.
c
shared_ptr: Присваивание одного shared_ptr другому уменьшает strong_count у левого операнда (если он указывал на объект) и увеличивает strong_count у правого операнда.weak_ptr: При создании weak_ptr из shared_ptr увеличивается weak_count в том же управляющем блоке. strong_count при этом не меняется.
c
shared_ptr (например, при выходе из области видимости или вызове reset()) уменьшается strong_count.
c
c
strong_count становится равным 0, объект, на который указывал shared_ptr, удаляется.strong_count, и weak_count равны 0, управляющий блок удаляется.weak_ptr: При уничтожении weak_ptr уменьшается weak_count.
c
Подсчет ссылок является потокобезопасным благодаря атомарным операциям над счетчиками внутри управляющего блока.
Пример структуры управляющего блока (упрощенно):
cpp