Namespaces
Variants

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

From cppreference.net
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)
说明:由于要求不翻译HTML标签、属性、代码块内容及C++专业术语,仅对页面中的纯文本进行了简体中文翻译。所有C++代码(包括关键字、类型名称、函数签名等)均保持原样,仅对序号和表格结构进行了保留。

从多种指针类型构造新的 shared_ptr ,这些指针指向需要管理的对象。

为便于下文描述,当满足以下任一条件时,指针类型 Y* 被称为与指针类型 T* 兼容:若 Y* 可转换为 T* ,或 Y 是数组类型 U[N] T U cv [] (其中 cv 为某组 cv 限定符)。

1,2) 构造一个没有托管对象的 shared_ptr ,即空 shared_ptr
3-7) 构造一个以 ptr 作为被管理对象指针的 shared_ptr 。若 T 是数组类型 U[N] ,则 Y(*)[N] 必须可转换为 T* 。若 T 是数组类型 U[] ,则 Y(*)[] 必须可转换为 T* 。否则, Y* 必须可转换为 T* 。此外:
3) 使用 delete 表达式 (若 T 不是数组类型,则为 delete ptr ;若 T 是数组类型,则为 delete [ ] ptr )作为删除器。 Y 必须是完整类型。该 delete 表达式必须格式正确、具有明确定义的行为且不抛出任何异常。
4,5) 使用指定的删除器 d 作为删除器。表达式 d ( ptr ) 必须格式正确、具有明确定义的行为且不抛出任何异常。 Deleter 必须满足 CopyConstructible 要求,且其拷贝构造函数和析构函数不得抛出异常。
6,7) (4,5) 相同,但额外使用 alloc 的副本进行内部数据分配。 Alloc 必须满足 Allocator 要求,且其拷贝构造函数和析构函数不得抛出异常。
8) 别名构造函数 :构造一个与 r 共享所有权信息,但持有无关且非托管指针 ptr shared_ptr 。即使该 shared_ptr 是组中最后一个离开作用域的,它也会调用由 r 最初管理的对象的析构函数。但对此调用 get() 将始终返回 ptr 的副本。程序员有责任确保该 ptr 在此 shared_ptr 存续期间保持有效,例如在典型使用场景中: ptr 是由 r 管理的对象的成员,或是 r. get ( ) 的别名(如下行转换)。
9) 构造一个与 r 所管理对象共享所有权的 shared_ptr 。若 r 未管理任何对象,则 * this 亦不管理任何对象。当 Y* T* 不兼容时,该模板重载不参与重载决议。
10) r 移动构造一个 shared_ptr 。构造完成后, * this 包含 r 先前状态的副本,而 r 变为空。若 Y* T* 兼容 ,则该模板重载不参与重载决议。
11) 构造一个与 r 所管理对象共享所有权的 shared_ptr Y* 必须与 T* 兼容。注意 r. lock ( ) 可用于相同目的:区别在于当参数为空时,该构造函数会抛出异常,而 weak_ptr < T > :: lock ( ) 在这种情况下会构造一个空的 shared_ptr
12) 构造一个存储并拥有原本由 r 所拥有对象的 shared_ptr Y* 必须可转换为 T* 。构造完成后, r 变为空。
13) 构造一个管理当前由 r 管理的对象的 shared_ptr 。与 r 关联的删除器将被存储用于未来删除被管理对象。调用后 r 不再管理任何对象。如果 Y* T* 不兼容,此重载不参与重载决议。
如果 D 是引用类型,等效于 shared_ptr ( r. release ( ) , std:: ref ( r. get_deleter ( ) ) 。否则等效于 shared_ptr ( r. release ( ) , r. get_deleter ( ) )

目录

注释

当从指向派生自 std::experimental::enable_shared_from_this 类型的对象的原始指针构造 shared_ptr 时, shared_ptr 的构造函数会更新 std::experimental::enable_shared_from_this 基类的私有 weak_ptr 成员,以便将来对 shared_from_this() 的调用能够与通过此原始指针构造函数创建的 shared_ptr 共享所有权。

原始指针重载假设拥有所指对象的所有权,因此对已由 shared_ptr 管理的对象使用原始指针重载构造 shared_ptr 可能导致未定义行为,即使该对象是继承自 std::experimental::enable_shared_from_this 的类型。

参数

ptr - 指向要管理的对象的指针
d - 用于销毁对象的删除器
alloc - 用于内部数据分配的分配器
r - 用于共享所有权或获取所有权的另一个智能指针

异常

3) std::bad_alloc 若无法获取所需的额外内存。对于其他错误可能抛出实现定义的异常。若发生异常,将调用相应的 delete 表达式(当 T 不是数组类型时为 delete ptr ,否则为 delete [ ] ptr )。
4-7) std::bad_alloc 若无法获取所需的额外内存。对于其他错误可能抛出实现定义的异常。若发生异常,将调用 d ( ptr )
11) std::bad_weak_ptr 如果 r. expired ( ) == true 。在此情况下构造函数不产生任何效果。
12) std::bad_alloc 如果无法获取所需的额外内存。对于其他错误可能抛出实现定义的异常。若发生异常,此构造函数不产生任何效果。
13) 如果抛出异常,构造函数将不产生任何效果。

示例

参见

创建管理新对象的共享指针
(函数模板)
创建使用分配器分配新对象的共享指针
(函数模板)