Используйте make_unique и make_shared вместо new/delete

Потенциальная проблема: безопасность при исключительных ситуациях и лишние дорогие выделения памяти.

Избегайте использования new/delete, malloc/free и другого низкоуровневого динамического распределения памяти. Исключением может являться placement new оператор, который должен крайне редко использоваться в очень узко специфичных задачах.

Используйте умные указатели: std::unique_ptr, std::shared_ptr, std::weak_ptr. Помните, что std::shared_ptr и std::weak_ptr имеют накладные расходы. Использовать ATL::CAutoPtr запрещено, так как он нарушает требования стандарта. Не используйте std::auto_ptr (объявлен устаревшим в C++11 и удален из стандарта в C++17).

Всегда предпочитайте std::make_shared и std::make_unique прямому использованию new для создания умных указателей, если нет специфических причин для обратного.

В случае передачи сырого указаля из new в конструктор std::shared_ptr происходит два выделения памяти (в самом операторе new и для создания контрольного блока в std::shared_ptr).

Неправильно:

auto foo = std::shared_ptr<Foo>(new Foo()); // Два выделения памяти!

Правильно:

auto foo = std::make_shared<Foo>(); // Одно выделение памяти

Кроме того, если в конструкторе std::shared_ptr при выделении памяти выбросится исключение std::bad_alloc, произойдет утечка, т.к. переданный сырой указатель не будет удален.

Чтобы создать std::unique_ptr, начиная с C++14 используется std::make_unique (это просто "синтаксический сахар").

auto foo = std::make_unique<Foo>();

Важное исключение Не используйте std::make_unique для массивов, особенно для базовых типов (char, short, int, double и т.п.), так как эта функция всегда инициализирует элементы массива нулями, это приводит к деградации производительности. Для массивов используйте std::array. В C++20 появился метод std::make_unique_for_overwrite, без накладных расходов на инициализацию элементов массива.