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 |
| Удар: низко |
AUTOSAR C++14 Rule A18-5-2 | AUTOSAR C++14 Rule A20-8-6 | Find defects (-checkers)