Выбор ответа Middle RAII и умные указатели спрашивают часто обновлено

Чем make_shared лучше shared_ptr(new T)

Вопрос

Главное преимущество std::make_shared<T>() перед std::shared_ptr<T>(new T):

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

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

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

Коротко

Правильный ответ: Одно выделение памяти на объект и управляющий блок вместо двух отдельных. makeshared размещает объект и управляющий блок в одном куске памяти: одна аллокация, лучшая локальность.

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

  1. Объект создаётся на стеке, а не в куче, и освобождается быстрее
  2. Одно выделение памяти на объект и управляющий блок вместо двух отдельныхправильный ответ
  3. Счётчик ссылок становится неатомарным и поэтому работает быстрее
  4. Память объекта освобождается сразу, даже если жив weak_ptr

Разбор

make_shared размещает объект и управляющий блок в одном куске памяти: одна аллокация, лучшая локальность. Побочный эффект: раз память общая, она освободится только когда умрут и все weak_ptr, хотя деструктор объекта вызовется вовремя.

  • Объект всё равно в куче.
  • Счётчики остаются атомарными.
  • Последний вариант как раз наоборот: при make_shared память держат weak_ptr.

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

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