Mediumумные указатели

Почему нужно предпочитать std::make_shared/shared_ptr(new T)?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

`make_shared` выделяет один блок памяти под control block и объект — одна аллокация вместо двух, лучше локальность кэша. Также безопасен от утечек при вычислении аргументов.

// ПЛОХО: если g() бросит, T утёк (shared_ptr ещё не создан)
f(std::shared_ptr<Widget>(new Widget()), g());

// ХОРОШО: make_shared атомарен относительно исключений
f(std::make_shared<Widget>(), g());

Минус make_shared: объект не освобождается, пока жив хоть один weak_ptr (память в объединённом блоке). Для больших объектов с долгоживущими weak — лучше shared_ptr(new T).

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.