new
or make_unique
instead of more
efficient make_shared
Использование new
или make_unique
для инициализации или сброса shared_ptr
приводит к дополнительному выделению памяти
Этот дефект возникает, когда вы используете:
new
или make_unique
для инициализации shared_ptr
образец. Для примера:
std::shared_ptr<T> p1(new T()); std::shared_ptr<T> p2(make_unique<T>());
new
для сброса shared_ptr
образец. Для примера:
std::shared_ptr<T> p1;
//...
p1.reset(new T);
Вы используете shared_ptr
образцы, когда необходимо, чтобы несколько смарт-указателей имели один и тот же объект и управляли им. Образцы также совместно используют блок управления, который содержит количество образцов, которые владеют управляемым объектом.
Polyspace® не помечает использование new
для инициализации shared_ptr
образец в частных или защищенных конструкторах. Для примера не возникает дефект при использовании new
в этом фрагменте кода:
class PrivateCTor { public: static std::shared_ptr<PrivateCTor> makeOne() { return std::shared_ptr<PrivateCTor>(new PrivateCTor); } private: PrivateCTor(); };
Когда вы используете new
или make_unique
для инициализации shared_ptr
например, дополнительная операция выделения создает устройство хранения данных для блока управления. Адрес дополнительного выделения может находиться на другой странице памяти или вне кэша данных по сравнению с адресом управляемого объекта.
Использование std::make_shared
для инициализации shared_ptr
образец. Функция выполняет одну операцию выделения с достаточным объемом памяти для хранения управляемого объекта и блока управления.
Эффективность улучшения могут варьироваться в зависимости от используемого компилятора, реализации библиотеки и окружения.
Группа: Эффективность |
Язык: C++ |
По умолчанию: Off |
Синтаксис командной строки
: MISSING_MAKE_SHARED |
Влияние: Низкое |