Счетчик ссылок в std::shared_ptr хранится в отдельном объекте — блоке управления (control block).
Блок управления создается:
std::shared_ptr из указателя.std::shared_ptr с пользовательским удалителем или аллокатором.std::make_shared или std::allocate_shared.Этот блок управления содержит как минимум два счетчика:
std::shared_ptr. Уменьшается при уничтожении std::shared_ptr. Когда этот счетчик становится нулем, освобождается управляемый объект.std::weak_ptr из std::shared_ptr. Уменьшается при уничтожении std::weak_ptr. Блок управления освобождается, когда оба счетчика — сильных и слабых ссылок — становятся нулем.Использование std::make_shared предпочтительнее прямого создания из new, так как оно может аллоцировать объект и блок управления одним блоком памяти, что улучшает производительность и уменьшает фрагментацию.
Счетчики атомарны, что делает std::shared_ptr безопасным для использования в многопоточных сценариях, хотя доступ к самому управляемому объекту не синхронизирован по умолчанию.
Пример:
cpp