Middle
54
questionbank

Как осуществляется подсчет ссылок в shared_ptr?

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

shared_ptr использует внутренний управляющий блок (control block), который содержит счетчик сильных ссылок (strong count) и счетчик слабых ссылок (weak count).

Механизм работы:

  1. Создание: При создании первого shared_ptr, указывающего на объект, создается управляющий блок с обоими счетчиками, инициализированными в 1.
    c
  2. Копирование shared_ptr: При копировании shared_ptr увеличивается strong_count в том же управляющем блоке.
    c
  3. Присваивание shared_ptr: Присваивание одного shared_ptr другому уменьшает strong_count у левого операнда (если он указывал на объект) и увеличивает strong_count у правого операнда.
  4. Создание weak_ptr: При создании weak_ptr из shared_ptr увеличивается weak_count в том же управляющем блоке. strong_count при этом не меняется.
    c
  5. Выход из области видимости или сброс: При уничтожении shared_ptr (например, при выходе из области видимости или вызове reset()) уменьшается strong_count.
    c
    c
  6. Освобождение объекта: Когда strong_count становится равным 0, объект, на который указывал shared_ptr, удаляется.
  7. Освобождение управляющего блока: Когда и strong_count, и weak_count равны 0, управляющий блок удаляется.
  8. Выход из области видимости или сброс weak_ptr: При уничтожении weak_ptr уменьшается weak_count.
    c

Подсчет ссылок является потокобезопасным благодаря атомарным операциям над счетчиками внутри управляющего блока.

Пример структуры управляющего блока (упрощенно):

cpp