Middle
71
questionbank

В чем разница между созданием объекта типа shared_ptr с помощью конструктора и с помощью функции make_shared?

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

Основное отличие — в количестве выделений памяти:

  1. Конструктор shared_ptr: Требует двух отдельных выделений памяти. Одно для самого объекта, другое для управляющего блока (control block), содержащего счетчики ссылок и прочую метаинформацию.
  2. make_shared: Выполняет одно единое выделение памяти для объекта и управляющего блока совместно.
ХарактеристикаКонструктор shared_ptrmake_shared
Количество аллокацийДвеОдна
ЭффективностьМенее эффективенБолее эффективен
Гарантии исключенийМеньше (возможна утечка в выражении)Больше (атомарная операция)
Использование динамического массиваВозможен (std::shared_ptr<T[]>)Невозможен (std::make_shared<T[]>)

Пример с конструктором:

c

Пример с make_shared:

c

Использование make_shared предпочтительнее в большинстве случаев из-за лучшей производительности и безопасности исключений. Однако, существуют сценарии, где только конструктор подходит, например, при создании shared_ptr из уже существующего "голого" указателя или при работе с пользовательскими аллокаторами.