Выбор ответа Senior RAII и умные указатели обновлено

shared_ptr из this

Вопрос

Объект класса Session уже управляется shared_ptr. В методе пишут return std::shared_ptr<Session>(this);. Чем это кончится?

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

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

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

Коротко

Правильный ответ: Второй управляющий блок и двойное удаление: нужен sharedfromthis(). Конструктор sharedptr из сырого указателя всегда создаёт новый управляющий блок.

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

  1. Второй управляющий блок и двойное удаление: нужен shared_from_this()правильный ответ
  2. Ничем: новый shared_ptr найдёт существующий счётчик ссылок по адресу
  3. Ошибка компиляции: из this нельзя создать shared_ptr внутри метода
  4. Утечкой памяти: объект не удалится, но падения при этом не будет

Разбор

Конструктор shared_ptr из сырого указателя всегда создаёт новый управляющий блок. Два независимых счётчика дойдут до нуля и оба вызовут delete: двойное удаление, UB. enable_shared_from_this хранит внутри weak_ptr на существующий блок, и shared_from_this() выдаёт указатель с общим счётчиком.

  • Сырой указатель ничего не знает о существующих shared_ptr.
  • Код компилируется.
  • Утечки нет, есть двойное удаление.

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

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