По порядку Middle RAII и умные указатели обновлено
Что происходит, когда умирает последний shared_ptr
Вопрос
Объект создан через std::make_shared, на него есть один shared_ptr и один weak_ptr. Расставьте события в порядке, в котором они происходят при уничтожении последнего shared_ptr и затем weak_ptr.
Попробуйте сами
Расставьте шаги по порядку стрелками.
- 1Освобождается общая память объекта и управляющего блока
- 2Уничтожается последний weak_ptr, счётчик слабых ссылок падает до нуля
- 3
weak_ptr::lock()теперь возвращает пустой shared_ptr - 4Управляющий блок и память остаются, пока жив weak_ptr
- 5Счётчик сильных ссылок уменьшается до нуля
- 6Вызывается деструктор объекта
Показать ответ и разбор
Коротко
Деструктор объекта вызывается сразу при нуле сильных ссылок, а память, выделенная makeshared одним куском, освобождается только после смерти последнего weakptr. С sharedptr(new T) память объекта вернулась бы сразу, а блок отдельно позже.
Правильный порядок
- 1Счётчик сильных ссылок уменьшается до нуля
- 2Вызывается деструктор объекта
- 3Управляющий блок и память остаются, пока жив weak_ptr
- 4
weak_ptr::lock()теперь возвращает пустой shared_ptr - 5Уничтожается последний weak_ptr, счётчик слабых ссылок падает до нуля
- 6Освобождается общая память объекта и управляющего блока
Разбор
Деструктор объекта вызывается сразу при нуле сильных ссылок, а память, выделенная make_shared одним куском, освобождается только после смерти последнего weak_ptr. С shared_ptr(new T) память объекта вернулась бы сразу, а блок отдельно позже.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.