Выбор ответа Middle RAII и умные указатели спрашивают часто обновлено
Цикл из shared_ptr
Вопрос
Узел A хранит shared_ptr на B, а B хранит shared_ptr на A. Внешние указатели на оба узла уничтожены. Что произойдёт?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Утечка: счётчики не упадут до нуля, деструкторы не вызовутся. Каждый объект удерживает другой, сильные счётчики остаются равными 1, и никто их не освободит.
Варианты ответа
- Оба объекта корректно удалятся:
shared_ptrобнаружит цикл - Двойное удаление и падение: каждый узел удалит соседа
- Утечка: счётчики не упадут до нуля, деструкторы не вызовутсяправильный ответ
- Ошибка компиляции из-за рекурсивного типа
A->B->A
Разбор
Каждый объект удерживает другой, сильные счётчики остаются равными 1, и никто их не освободит. Обратную ссылку нужно сделать weak_ptr или сырым указателем.
- Подсчёт ссылок не умеет находить циклы, в отличие от трассирующих сборщиков мусора.
- Двойного удаления нет, потому что удаления нет вовсе.
- Тип с
shared_ptrна себя же компилируется нормально.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «RAII и умные указатели»
- Модель shared_ptr: кто и когда уничтожится
- Дерево на unique_ptr: перенос и удаление поддеревьев
- Управляющий блок shared_ptr
- Объясни RAII на примерах
- Чем make_shared лучше shared_ptr(new T)
- Что происходит, когда умирает последний shared_ptr
- Что выведет: порядок конструкторов и деструкторов
- Что выведет: use_count и weak_ptr