new или make_unique вместо более эффективного 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++ |
| По умолчанию: Откл. |
Синтаксис командной строки:
MISSING_MAKE_SHARED |
| Воздействие: Низкий |