std::experimental::shared_ptr<T>:: shared_ptr
|
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-квалификаторов).
shared_ptr
без управляемого объекта, т.е. пустой
shared_ptr
.
shared_ptr
с
ptr
в качестве указателя на управляемый объект. Если
T
является типом массива
U[N]
,
Y(*)[N]
должен быть преобразуем в
T*
. Если
T
является типом массива
U[]
,
Y(*)[]
должен быть преобразуем в
T*
. В противном случае
Y*
должен быть преобразуем в
T*
. Дополнительно:
T
не является массивным типом;
delete
[
]
ptr
если
T
является массивным типом) в качестве удалителя.
Y
должен быть полным типом. Это выражение delete должно быть корректно сформировано, иметь хорошо определенное поведение и не генерировать исключений.
Deleter
должен быть
CopyConstructible
, и его конструктор копирования и деструктор не должны вызывать исключений.
Alloc
должен быть
Allocator
, и его конструктор копирования и деструктор не должны генерировать исключения.
shared_ptr
, который разделяет информацию о владении с
r
, но содержит несвязанный и неуправляемый указатель
ptr
. Даже если этот
shared_ptr
является последним в группе, который выходит из области видимости, он вызовет деструктор для объекта, изначально управляемого
r
. Однако вызов
get()
на нем всегда вернет копию
ptr
. Программист обязан обеспечить, чтобы этот
ptr
оставался действительным, пока существует данный shared_ptr, как в типичных случаях использования, когда
ptr
является членом объекта, управляемого
r
, или является алиасом (например, приведением типа) для
r.
get
(
)
.
shared_ptr
, который разделяет владение объектом, управляемым
r
. Если
r
не управляет объектом,
*
this
также не управляет объектом. Шаблонная перегрузка не участвует в разрешении перегрузки, если
Y*
не
совместим с
T*
.
shared_ptr
из
r
. После конструирования
*
this
содержит копию предыдущего состояния
r
,
r
становится пустым. Шаблонная перегрузка не участвует в разрешении перегрузки, если
Y*
не
совместим с
T*
.
shared_ptr
, который разделяет владение объектом, управляемым
r
.
Y*
должен быть
совместим с
T*
. Обратите внимание, что
r.
lock
(
)
может использоваться для той же цели: разница заключается в том, что этот конструктор выбрасывает исключение, если аргумент пуст, тогда как
weak_ptr
<
T
>
::
lock
(
)
создает пустой
shared_ptr
в этом случае.
shared_ptr
, который хранит и владеет объектом, ранее принадлежавшим
r
.
Y*
должен быть конвертируемым в
T*
. После конструирования
r
становится пустым.
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 | - | другой умный указатель для разделения владения или получения владения |
Исключения
T
не является массивным типом,
delete
[
]
ptr
в противном случае) вызывается при возникновении исключения.
Пример
|
Этот раздел не завершён
Причина: отсутствует пример |
Смотрите также
|
создает shared pointer, который управляет новым объектом
(шаблон функции) |
|
|
создает shared pointer, который управляет новым объектом, выделенным с использованием аллокатора
(шаблон функции) |