Namespaces
Variants

std::experimental::shared_ptr<T>:: shared_ptr

From cppreference.net
**Примечание:** Весь код C++ внутри тегов ` ` сохранен без изменений, как и требовалось. HTML-разметка и атрибуты также сохранены в оригинальном виде.
constexpr shared_ptr ( ) noexcept ;
(1)
constexpr shared_ptr ( std:: nullptr_t ) noexcept ;
(2)
template < class Y >
explicit shared_ptr ( Y * ptr ) ;
(3)
template < class Y, class Deleter >
shared_ptr ( Y * ptr, Deleter d ) ;
(4)
template < class Deleter >
shared_ptr ( std:: nullptr_t ptr, Deleter d ) ;
(5)
template < class Y, class Deleter, class Alloc >
shared_ptr ( Y * ptr, Deleter d, Alloc alloc ) ;
(6)
template < class Deleter, class Alloc >
shared_ptr ( std:: nullptr_t ptr, Deleter d, Alloc alloc ) ;
(7)
template < class Y >
shared_ptr ( const shared_ptr < Y > & r, element_type * ptr ) noexcept ;
(8)
shared_ptr ( const shared_ptr & r ) noexcept ;
(9)
template < class Y >
shared_ptr ( const shared_ptr < Y > & r ) noexcept ;
(9)
shared_ptr ( shared_ptr && r ) noexcept ;
(10)
template < class Y >
shared_ptr ( shared_ptr < Y > && r ) noexcept ;
(10)
template < class Y >
explicit shared_ptr ( const std:: weak_ptr < Y > & r ) ;
(11)
template < class Y >
shared_ptr ( std:: auto_ptr < Y > && r ) ;
(12)
template < class Y, class Deleter >
shared_ptr ( std:: unique_ptr < Y,Deleter > && r ) ;
(13)

Создает новый shared_ptr из различных типов указателей, ссылающихся на управляемый объект.

Для целей нижеследующего описания указательный тип Y* считается совместимым с указательным типом T* если либо Y* преобразуется в T* , либо Y является типом массива U[N] и T является U cv [] (где cv — некоторый набор cv-квалификаторов).

1,2) Создает shared_ptr без управляемого объекта, т.е. пустой shared_ptr .
3-7) Создает shared_ptr с ptr в качестве указателя на управляемый объект. Если T является типом массива U[N] , Y(*)[N] должен быть преобразуем в T* . Если T является типом массива U[] , Y(*)[] должен быть преобразуем в T* . В противном случае Y* должен быть преобразуем в T* . Дополнительно:
3) Использует delete-expression ( delete ptr , если T не является массивным типом; delete [ ] ptr если T является массивным типом) в качестве удалителя. Y должен быть полным типом. Это выражение delete должно быть корректно сформировано, иметь хорошо определенное поведение и не генерировать исключений.
4,5) Использует указанный удалитель d в качестве удалителя. Выражение d ( ptr ) должно быть корректно сформированным, иметь хорошо определённое поведение и не вызывать исключений. Deleter должен быть CopyConstructible , и его конструктор копирования и деструктор не должны вызывать исключений.
6,7) То же, что и (4,5) , но дополнительно использует копию alloc для выделения данных для внутреннего использования. Alloc должен быть Allocator , и его конструктор копирования и деструктор не должны генерировать исключения.
8) Алиасинговый конструктор : создает shared_ptr , который разделяет информацию о владении с r , но содержит несвязанный и неуправляемый указатель ptr . Даже если этот shared_ptr является последним в группе, который выходит из области видимости, он вызовет деструктор для объекта, изначально управляемого r . Однако вызов get() на нем всегда вернет копию ptr . Программист обязан обеспечить, чтобы этот ptr оставался действительным, пока существует данный shared_ptr, как в типичных случаях использования, когда ptr является членом объекта, управляемого r , или является алиасом (например, приведением типа) для r. get ( ) .
9) Создает shared_ptr , который разделяет владение объектом, управляемым r . Если r не управляет объектом, * this также не управляет объектом. Шаблонная перегрузка не участвует в разрешении перегрузки, если Y* не совместим с T* .
10) Перемещающий конструктор для shared_ptr из r . После конструирования * this содержит копию предыдущего состояния r , r становится пустым. Шаблонная перегрузка не участвует в разрешении перегрузки, если Y* не совместим с T* .
11) Создает shared_ptr , который разделяет владение объектом, управляемым r . Y* должен быть совместим с T* . Обратите внимание, что r. lock ( ) может использоваться для той же цели: разница заключается в том, что этот конструктор выбрасывает исключение, если аргумент пуст, тогда как weak_ptr < T > :: lock ( ) создает пустой shared_ptr в этом случае.
12) Создает shared_ptr , который хранит и владеет объектом, ранее принадлежавшим r . Y* должен быть конвертируемым в T* . После конструирования r становится пустым.
13) Создает shared_ptr , который управляет объектом, находящимся в настоящее время под управлением r . Связанный с r удалитель сохраняется для последующего удаления управляемого объекта. r не управляет никаким объектом после вызова. Эта перегрузка не участвует в разрешении перегрузки, если Y* не совместим с T* .
Если D является ссылочным типом, эквивалентно shared_ptr ( r. release ( ) , std:: ref ( r. get_deleter ( ) ) . В противном случае эквивалентно shared_ptr ( r. release ( ) , r. get_deleter ( ) ) .

Содержание

Примечания

При создании shared_ptr из необработанного указателя на объект типа, производного от std::experimental::enable_shared_from_this , конструкторы shared_ptr обновляют закрытый член weak_ptr базового класса std::experimental::enable_shared_from_this , чтобы последующие вызовы shared_from_this() разделяли владение с shared_ptr , созданным данным конструктором из необработанного указателя.

Перегрузки с необработанными указателями предполагают владение объектом, на который указывает указатель, поэтому создание shared_ptr с использованием перегрузки с необработанным указателем для объекта, который уже управляется shared_ptr , может привести к неопределённому поведению, даже если объект имеет тип, производный от std::experimental::enable_shared_from_this .

Параметры

ptr - указатель на управляемый объект
d - удалитель для уничтожения объекта
alloc - аллокатор для выделения памяти для внутреннего использования
r - другой умный указатель для разделения владения или получения владения

Исключения

3) std::bad_alloc если требуемая дополнительная память не может быть получена. Может выбрасывать реализационно-определённое исключение для других ошибок. Соответствующее выражение delete ( delete ptr если T не является массивным типом, delete [ ] ptr в противном случае) вызывается при возникновении исключения.
4-7) std::bad_alloc если не удалось получить необходимую дополнительную память. Может выбрасывать определяемые реализацией исключения при других ошибках. d ( ptr ) вызывается при возникновении исключения.
11) std::bad_weak_ptr если r. expired ( ) == true . В этом случае конструктор не имеет эффекта.
12) std::bad_alloc если не удалось получить необходимую дополнительную память. Может выбрасывать реализационно-определённое исключение для других ошибок. Этот конструктор не имеет эффекта, если возникает исключение.
13) Если выбрасывается исключение, конструктор не имеет эффекта.

Пример

Смотрите также

создает shared pointer, который управляет новым объектом
(шаблон функции)
создает shared pointer, который управляет новым объектом, выделенным с использованием аллокатора
(шаблон функции)