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 |
| Влияние: Низкое |