Junior
58
questionbank

На основе чего несколько `shared_ptr` могут ссылаться на один и тот же объект?

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

Несколько shared_ptr могут ссылаться на один и тот же объект благодаря использованию управляющего блока (control block).

Этот управляющий блок хранится в динамической памяти и содержит:

  • Счётчик сильных ссылок (strong reference count): Увеличивается при создании нового shared_ptr, ссылающегося на объект, или при копировании существующего shared_ptr. Уменьшается при уничтожении shared_ptr. Когда счётчик сильных ссылок достигает нуля, объект, на который указывают shared_ptr, уничтожается.
  • Счётчик слабых ссылок (weak reference count): Увеличивается при создании weak_ptr из shared_ptr. Уменьшается при уничтожении weak_ptr. Управляющий блок уничтожается только тогда, когда оба счётчика (сильных и слабых ссылок) достигают нуля.
  • Указатель на объект (pointer to the data object): Сам адрес объекта в памяти.
  • Указатель на функцию-деструктор (deleter): Необязательно, используется для кастомного удаления объекта.
  • Указатель на аллокатор (allocator): Необязательно, используется, если при создании shared_ptr указывался кастомный аллокатор.

Когда создается первый shared_ptr для данного объекта, аллоцируется управляющий блок. Последующие shared_ptr, созданные либо копированием, либо из weak_ptr, используют уже существующий управляющий блок, увеличивая счётчик сильных ссылок. Благодаря этому все shared_ptr, указывающие на один объект, "знают" об общем ресурсе и о том, сколько еще shared_ptr им владеют.

Например:

c

Таким образом, управляющий блок служит центральным механизмом для отслеживания владения объектом и управления его временем жизни, позволяя нескольким shared_ptr безопасно ссылаться на один и тот же ресурс.