Используйте 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).
Неправильно:
Правильно:
Кроме того, если в конструкторе std::shared_ptr при выделении памяти выбросится исключение std::bad_alloc, произойдет утечка, т.к. переданный сырой указатель не будет удален.
Чтобы создать std::unique_ptr, начиная с C++14 используется std::make_unique (это просто "синтаксический сахар").
Важное исключение
Не используйте std::make_unique для массивов, особенно для базовых типов (char, short, int, double и т.п.), так как эта функция всегда инициализирует элементы массива нулями, это приводит к деградации производительности. Для массивов используйте std::array.
В C++20 появился метод std::make_unique_for_overwrite, без накладных расходов на инициализацию элементов массива.