Выбор ответа Middle RAII и умные указатели спрашивают часто обновлено

Цикл из shared_ptr

Вопрос

Узел A хранит shared_ptr на B, а B хранит shared_ptr на A. Внешние указатели на оба узла уничтожены. Что произойдёт?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Утечка: счётчики не упадут до нуля, деструкторы не вызовутся. Каждый объект удерживает другой, сильные счётчики остаются равными 1, и никто их не освободит.

Варианты ответа

  1. Оба объекта корректно удалятся: shared_ptr обнаружит цикл
  2. Двойное удаление и падение: каждый узел удалит соседа
  3. Утечка: счётчики не упадут до нуля, деструкторы не вызовутсяправильный ответ
  4. Ошибка компиляции из-за рекурсивного типа A -> B -> A

Разбор

Каждый объект удерживает другой, сильные счётчики остаются равными 1, и никто их не освободит. Обратную ссылку нужно сделать weak_ptr или сырым указателем.

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

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.