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
оператор.
Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».
Группа: Библиотека общих утилит |
Категория: Необходимый, Автоматизированный |