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