Создание shared_ptr через make_shared и через new

Создание std::shared_ptr через std::make_shared может быть полезным в следующем случае:

boo(std::shared_ptr<Bar>(new Bar), foo());

здесь может быть утечка, если foo бросит исключение, и

boo(std::make_shared<Bar>(), foo());

исключит утечку памяти.

Вопрос: в общем случае, например

 std::shared_ptr<Bar> pBar(new Bar);

лучше использовать new или использовать std::make_shared?


Ответы (1 шт):

Автор решения: Bogdan

Из Скотт Мейерс - "Эффективный и современный С++ 11/14" (глава 4.4):

Особенностью std::make_shared (по сравнению с непосредственным использованием new) является повышенная эффективность. Применение std::make_shared позволяет компиляторам генерировать меньший по размеру и более быстрый код, использующий более компактные структуры данных.

Там написано достаточно детально (рекомендую почитать), но вкратце в случае

std::shared_ptr<Bar> pBar(new Bar);

произойдет 2 выделения памяти: одно для new Bar, другое для управляющего блока умного указателя.

В случае же

auto pBar = std::make_shared<Bar>();

может быть выполнено одно выделение с последующим размещением объекта Bar в управляющем блоке умного указателя. Таким образом количество выделений памяти может быть сокращено до одного.

Что именно попадет в исполняемый файл зависит от оптимизаций компилятора.

В целом же автор рекомендует:

предпочитайте использование std::make_unique и std::make_shared непосредственному использованию оператора new

→ Ссылка