🤔
Как работает счетчик у shared_ptr?shared_ptr использует счетчик ссылок для управления памятью, что позволяет нескольким умным указателям делить владение одним объектом. Это механизм, который подсчитывает количество экземпляров
shared_ptr, которые указывают на тот же управляемый объект. Когда новый
shared_ptr создается и указывает на объект, счетчик ссылок увеличивается. Когда
shared_ptr уничтожается или перестает указывать на объект, счетчик уменьшается. Объект, на который указывали, освобождается (то есть его деструктор вызывается), когда счетчик ссылок достигает нуля. Это гарантирует, что память освобождается корректно и в нужный момент.
🚩
Как он работает 🟠
Инициализация и копированиеКогда создается
shared_ptr и он начинает управлять объектом, создается "блок управления" (control block), содержащий счетчик ссылок.
Каждый раз, когда создается новый
shared_ptr, который указывает на тот же объект (через копирование или присваивание), счетчик ссылок увеличивается.
🟠
Уничтожение и перемещениеКогда
shared_ptr уничтожается или его значение присваивается другому
shared_ptr, счетчик ссылок уменьшается.
Если
shared_ptr перемещается (используя move-семантику), счетчик ссылок не изменяется, так как владение объектом передается новому
shared_ptr, а старый перестает владеть объектом.
🟠
Освобождение ресурсовКак только счетчик ссылок достигает нуля (то есть последний
shared_ptr, указывающий на объект, был уничтожен или переназначен), объект удаляется. Соответственно, если для объекта был задан пользовательский делетер, он вызывается вместо стандартного
delete.
🚩
Счетчик слабых ссылокshared_ptr также поддерживает
weak_ptr, который представляет собой "слабую" ссылку на объект.
weak_ptr позволяет наблюдать за объектом, не увеличивая счетчик сильных ссылок:
Счетчик слабых ссылок отслеживает, сколько
weak_ptr указывает на объект. Он не предотвращает удаление объекта, когда счетчик сильных ссылок достигает нуля.
Когда счетчик сильных ссылок достигает нуля и объект удаляется, счетчик слабых ссылок все еще отслеживает, сколько
weak_ptr наблюдают за объектом. Объект блока управления остается, пока не исчезнут все
weak_ptr.
Ставь 👍 и забирай 📚 Базу знаний