По порядку Middle RAII и умные указатели обновлено

Что происходит, когда умирает последний shared_ptr

Вопрос

Объект создан через std::make_shared, на него есть один shared_ptr и один weak_ptr. Расставьте события в порядке, в котором они происходят при уничтожении последнего shared_ptr и затем weak_ptr.

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

Расставьте шаги по порядку стрелками.

  1. 1
    Освобождается общая память объекта и управляющего блока
  2. 2
    Уничтожается последний weak_ptr, счётчик слабых ссылок падает до нуля
  3. 3
    weak_ptr::lock() теперь возвращает пустой shared_ptr
  4. 4
    Управляющий блок и память остаются, пока жив weak_ptr
  5. 5
    Счётчик сильных ссылок уменьшается до нуля
  6. 6
    Вызывается деструктор объекта
Показать ответ и разбор

Коротко

Деструктор объекта вызывается сразу при нуле сильных ссылок, а память, выделенная makeshared одним куском, освобождается только после смерти последнего weakptr. С sharedptr(new T) память объекта вернулась бы сразу, а блок отдельно позже.

Правильный порядок

  1. 1
    Счётчик сильных ссылок уменьшается до нуля
  2. 2
    Вызывается деструктор объекта
  3. 3
    Управляющий блок и память остаются, пока жив weak_ptr
  4. 4
    weak_ptr::lock() теперь возвращает пустой shared_ptr
  5. 5
    Уничтожается последний weak_ptr, счётчик слабых ссылок падает до нуля
  6. 6
    Освобождается общая память объекта и управляющего блока

Разбор

Деструктор объекта вызывается сразу при нуле сильных ссылок, а память, выделенная make_shared одним куском, освобождается только после смерти последнего weak_ptr. С shared_ptr(new T) память объекта вернулась бы сразу, а блок отдельно позже.

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

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