Выбор ответа Senior RAII и умные указатели обновлено
shared_ptr из this
Вопрос
Объект класса Session уже управляется shared_ptr. В методе пишут return std::shared_ptr<Session>(this);. Чем это кончится?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Второй управляющий блок и двойное удаление: нужен sharedfromthis(). Конструктор sharedptr из сырого указателя всегда создаёт новый управляющий блок.
Варианты ответа
- Второй управляющий блок и двойное удаление: нужен
shared_from_this()правильный ответ - Ничем: новый
shared_ptrнайдёт существующий счётчик ссылок по адресу - Ошибка компиляции: из
thisнельзя создатьshared_ptrвнутри метода - Утечкой памяти: объект не удалится, но падения при этом не будет
Разбор
Конструктор shared_ptr из сырого указателя всегда создаёт новый управляющий блок. Два независимых счётчика дойдут до нуля и оба вызовут delete: двойное удаление, UB. enable_shared_from_this хранит внутри weak_ptr на существующий блок, и shared_from_this() выдаёт указатель с общим счётчиком.
- Сырой указатель ничего не знает о существующих shared_ptr.
- Код компилируется.
- Утечки нет, есть двойное удаление.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.