Назад к вопросам
Middle
108
questionbank
В чем разница между созданием объекта типа shared_ptr с помощью конструктора и с помощью функции make_shared?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Основное отличие — в количестве выделений памяти:
- Конструктор
shared_ptr: Требует двух отдельных выделений памяти. Одно для самого объекта, другое для управляющего блока (control block), содержащего счетчики ссылок и прочую метаинформацию. 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 из уже существующего "голого" указателя или при работе с пользовательскими аллокаторами.