23 General utilities library [utilities]

23.11 Smart pointers [smartptr]

23.11.2 Shared-ownership pointers [util.smartptr]

23.11.2.2 Class template shared_­ptr [util.smartptr.shared]

23.11.2.2.6 shared_­ptr creation [util.smartptr.shared.create]

template<class T, class... Args> shared_ptr<T> make_shared(Args&&... args); template<class T, class A, class... Args> shared_ptr<T> allocate_shared(const A& a, Args&&... args);

Requires: Выражение ​::​new (pv) T(std​::​forward<Args>(args)...), где pv имеет тип void* и указывает на хранилище, подходящее для хранения объекта типа T, должно быть правильно сформировано. A должен быть allocator. Конструктор копирования и деструктор A не должны вызывать исключений.

Effects: Выделяет память, подходящую для объекта типа, T и создает объект в этой памяти через размещение new-expression ​::​new (pv) T(std​::​forward<Args>(args)...). В шаблоне для выделения памяти allocate_­shared используется копия a . Если выбрасывается исключение, функции не действуют.

Returns: shared_­ptr Экземпляр , который хранит и владеет адрес создаваемого объекта типа T.

Postconditions: get() != 0 && use_­count() == 1.

Throws: bad_­allocили исключение, A​::​allocate созданное конструктором T.

Remarks: shared_­ptr Конструктор вызывается этой функции позволяет shared_­from_­this с адресом создаваемого объекта типа T. Реализации должны выполнять не более одного распределения памяти. [ Note: Это обеспечивает эффективность, эквивалентную навязчивому интеллектуальному указателю. ] end note

[ Note: Эти функции обычно выделяют больше памяти, чем sizeof(T) позволяют внутренние структуры бухгалтерского учета, такие как счетчик ссылок. ] end note