Счетчик ссылок в 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
Счетчик ссылок в 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
Зарегистрируйтесь или войдите, чтобы получить доступ к полным ответам на все вопросы из банка вопросов.