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.Ставь 👍 и забирай 📚 Базу знаний