Назад к вопросам
Middle
108
questionbank

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

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

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

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

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

// Выделение памяти для MyObject
MyObject* obj = new MyObject();
// Выделение памяти для управляющего блока
std::shared_ptr<MyObject> ptr_ctor(obj);

Пример с make_shared:

// Одно выделение памяти для MyObject и управляющего блока
std::shared_ptr<MyObject> ptr_make = std::make_shared<MyObject>();

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