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

368
22 июля 2022, 07:50

Создание 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?

Answer 1

Из Скотт Мейерс - "Эффективный и современный С++ 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

READ ALSO
Флаги и манипуляторы форматирования

Флаги и манипуляторы форматирования

У меня есть переменная double d = 123321

226
Изменение всех элементов вектора

Изменение всех элементов вектора

Есть двумерный вектор: vector<vector<int>> a(n, vector<int>(c+1, 0))И хочется изменить все его элементы на определенну константу (например 1)

344
Является ли оператор функцией?

Является ли оператор функцией?

Является ли оператор функцией? Например при перегрузке оператора присваивания для определенного класса, мы можем вызвать его как обычную...

351
Привязка ко времени в sfml

Привязка ко времени в sfml

Есть простая программа, которая должна реагировать на клавишу, и задавать шару ускорение, когда клавиша отпускаеться, шар движется с прежней...

272