shared_ptr 类
将引用计数智能指针围绕动态分配对象。
template<class Ty>
class shared_ptr {
public:
typedef Ty element_type;
shared_ptr();
shared_ptr(nullptr_t);
shared_ptr(const shared_ptr& sp);
shared_ptr(shared_ptr&& sp);
template<class Other>
explicit shared_ptr(Other * ptr);
template<class Other, class D>
shared_ptr(Other * ptr, D dtor);
template<class D>
shared_ptr(nullptr_t, D dtor);
template<class Other, class D, class A>
shared_ptr(Other *ptr, D dtor, A alloc);
template<class D, class A>
shared_ptr(nullptr_t, D dtor, A alloc);
template<class Other>
shared_ptr(const shared_ptr<Other>& sp);
template<class Other>
shared_ptr(const shared_ptr<Other>&& sp);
template<class Other>
explicit shared_ptr(const weak_ptr<Other>& wp);
template<class Other>
shared_ptr(auto_ptr<Other>& ap);
template<class Other, class D>
shared_ptr(unique_ptr<Other, D>&& up);
template<class Other>
shared_ptr(const shared_ptr<Other>& sp, Ty *ptr);
~shared_ptr();
shared_ptr& operator=(const shared_ptr& sp);
template<class Other>
shared_ptr& operator=(const shared_ptr<Other>& sp);
shared_ptr& operator=(shared_ptr&& sp);
template<class Other>
shared_ptr& operator=(shared_ptr<Other>&& sp);
template<class Other>
shared_ptr& operator=(auto_ptr< Other >&& ap);
template <class Other, class D>
shared_ptr& operator=(const unique_ptr< Other, D>& up) = delete;
template <class Other, class D>
shared_ptr& operator=(unique_ptr<Other, D>&& up);
void swap(shared_ptr& sp);
void reset();
template<class Other>
void reset(Other *ptr);
template<class Other, class D>
void reset(Other *ptr, D dtor);
template<class Other, class D, class A>
void reset(Other *ptr, D dtor, A alloc);
Ty *get() const;
Ty& operator*() const;
Ty *operator->() const;
long use_count() const;
bool unique() const;
operator bool() const;
template<class Other>
bool owner_before(shared_ptr<Other> const& ptr) const;
template<class Other>
bool owner_before(weak_ptr<Other> const& ptr) const;
template<class D, class Ty>
D* get_deleter(shared_ptr<Ty> const& ptr);
};
参数
Ty
由共享指针控制的类型。Other
由参数指针控制的类型。ptr
复制的指针。D
删除器的类型。A
分配算符的类型。dtor
删除器alloc
分配器。sp
复制或移动的智能指针。wp
复制或移动的弱指针。ap
复制或移动的自动指针。up
移动的唯一指针。
备注
模板类描述对象使用引用计数管理资源。 shared_ptr 对象持有一个指向它自己或者空指针的资源。 资源可以由一个以上的 shared_ptr 对象所拥有,当拥有特定资源的最后的shared_ptr对象被破坏,资源被释放。
当它被重新分配或重新设置时 shared_ptr 停止拥有的资源,。
模板参数 Ty可能是一个不完整的类型,除非另有说明某些成员函数。
当一个shared_ptr<Ty>对象是从一个 G* 指针类型,或 shared_ptr<G> 指针类型获取资源的,那指针类型G*必须是可以转化为Ty* 。 如果不是,代码将不进行编译。 例如:
class F {};
class G : public F {};
#include <memory>
using namespace std;
shared_ptr<G> sp0(new G); // okay, template parameter G and argument G*
shared_ptr<G> sp1(sp0); // okay, template parameter G and argument shared_ptr<G>
shared_ptr<F> sp2(new G); // okay, G* convertible to F*
shared_ptr<F> sp3(sp0); // okay, template parameter F and argument shared_ptr<G>
shared_ptr<F> sp4(sp2); // okay, template parameter F and argument shared_ptr<F>
shared_ptr<int> sp5(new G); // error, G* not convertible to int*
shared_ptr<int> sp6(sp2); // error, template parameter int and argument shared_ptr<F>
一个 shared_ptr 对象拥有一个资源:
如果构造了对该资源的指针,
如果它是由一个拥有那个资源shared_ptr 的对象构造的,
如果从 weak_ptr 类对象 构造了一个指向那资源,或者
如果资源被分配到它的所有权,或者shared_ptr::operator= 或者调用成员函数shared_ptr::reset。
shared_ptr 对象 拥有一个资源共享的控制块。 控制块拥有:
自己拥有资源的 shared_ptr 对象数
指向资源 weak_ptr 对象数
如果有的话,删除器会删除那个资源,
如果有,自定义分配器控制块。
shared_ptr 对象是用一个非空的指针,它指向一个非空控制块 在 shared_ptr 对象释放资源之后,它将不再拥有资源。 在 weak_ptr 对象释放资源之后,它将不在指向资源。
当该拥有资源的 shared_ptr 对象的数量变为零时,该资源被释放,或者通过删除或通过将其地址到一个删除器,这取决于如何对资源的所有权在最初创建。 当该拥有资源的 shared_ptr 对象的数量为零时,并且指向该资源的 weak_ptr 对象的数量是零,则控制块被释放,使用自定义分配给所述控制块(如果有)。
空的 shared_ptr 对象没有自己的资源和控制块。
删除器是一个有成员函数 operator() 的函数对象。 其类型必须是可配置的副本,其复制构造函数和析构函数不能引发异常。 它接受参数,要删除的对象。
有些函数接受一个参数列表,它定义了由此而来的性质 shared_ptr<Ty> 或者 weak_ptr<Ty> 对象。 可以有多种指定这些参数列表的方法:
没有参数 --结果对象是一个空的 shared_ptr 对象或者一个空的 weak_ptr 对象。
ptr 是一种用来管理 Other* 对象类型的指针。 Ty 必须是完整类型的。 如果函数失败(因为控制模块无法分配),其评估表达式 delete ptr 。
ptr, dtor 是一种用来管理或者资源的一个删除器 Other* 对象类型的指针。 如果函数失败(因为控制模块无法分配),调用 dtor(ptr) ,它必须被很好的定义。
ptr, dtor, alloc 是一种 Other* 用来管理资源,该资源的资源删除器,管理存储、分配、释放的指针。 如果函数失败(因为控制模块无法分配),调用 dtor(ptr) ,它必须被很好的定义。
sp 一种拥有要管理资源的 shared_ptr<Other> 对象。
wp 是一种用来指向管理资源 weak_ptr<Other> 对象。
ap 是一种持有指向管理资源 auto_ptr<Other> 对象。 如果函数成功调用 ap.release() ,否则它维持 ap 不变。
所有情况下,指针类型 Other* 必须是可转换为 Ty* 的。
线程安全
多线程可以同时读写不同的 shared_ptr 对象,即使当对象是共有的副本。
成员
构造函数
构造 shared_ptr。 |
|
销毁 shared_ptr。 |
方法
元素的类型。 |
|
获取特定资源地址。 |
|
如果 shared_ptr 是之前指针所命令的,返回true。 |
|
替换拥有的资源。 |
|
交换两个 shared_ptr 对象。 |
|
测试资源是否唯一的。 |
|
计数资源所有者的数量。 |
运算符
测试资源是否存在。 |
|
获取一个指定的值。 |
|
替换特定资源。 |
|
获取指向该指定的值的指针。 |
要求
页眉: <内存>
命名空间: std