std::make_shared должны использоваться для строительства объектов, принадлежащих std::shared_ptr
std::make_shared должны использоваться для строительства объектов, принадлежащих std::shared_ptr.
Вместо выделения памяти с помощью new оператор и преобразование результирующего необработанного указателя в std::shared_ptr объект, например:
class numberClass {
public:
numberClass(int n): number(n){}
private:
int number;
}
int aNumber=1;
std::shared_ptr<numberClass> numberPtr (new numberClass(aNumber)); std::shared_ptr объект непосредственно с использованием std::make_shared функция. Например:auto numberPtr = std::make_shared<numberClass>(aNumber);
Используя std::make_shared является предпочтительным, поскольку:
Создание std::shared_ptr объект выполняется в одном динамическом выделении памяти и повышает производительность во время выполнения. В противном случае создайте необработанный указатель с помощью new оператор требует одного динамического выделения памяти и преобразования необработанного указателя в std::shared_ptr Для объекта требуется второе распределение. Второе выделение создает управляющий блок, который отслеживает число ссылок совместно используемого ресурса и делает std::shared_ptr объект, осведомленный обо всех указателях на общий ресурс.
Создание std::shared_ptr объект с использованием std::make_shared является исключением-безопасным. В противном случае между динамическим выделением памяти и new оператор и последующее преобразование, приводящее к утечке памяти. Исключение вызывает утечку памяти только в определенных контекстах, например, когда std::shared_ptr создается в аргументе многопараметрической функции, и другая оценка аргумента функции порождает исключение.
Можно использовать более сжатый синтаксис. Нет необходимости повторять тип данных объекта, который назначается динамически.
Средство проверки помечает создание std::shared_ptr объект (или boost::shared_ptr объект) из необработанного указателя, возвращенного new оператор.
Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.
| Группа: Библиотека общих утилит |
| Категория: Обязательно, Автоматизировано |