Создание 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?
Из Скотт Мейерс - "Эффективный и современный С++ 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
Сборка персонального компьютера от Artline: умный выбор для современных пользователей