shared_ptr
smart_ptr中最重要最有用的计数型智能指针,可以被自由地拷贝和赋值,在任意的地方共享,引用计数为0时才删除被包装的动态对象,同时shared_ptr可以安全的放到标准容器中。以下是类摘要和注解:
-
template<class T> class shared_ptr
-
{
-
public:
-
typedef T element_type;
-
-
shared_ptr();
-
template<class Y> explicit shared_ptr(Y *p); //引用计数置为1
-
template<class Y, class D> shared_ptr(Y *p, D d);
-
~shared_ptr();
-
-
shared_ptr(shared_ptr const &r);
-
template explicit shared_ptr(std::auto_ptr &r);
-
-
shared_ptr &operator=(shared_ptr const &r); //从另一个shared_ptr获得指针管理权,引用计数+1
-
template shared_ptr &operator=(shared_ptr const &r);
-
template shared_ptr &operator=(std::auto_ptr &r); //从一个auto_ptr获得指针管理权,同时auto_ptr失去管理权
-
-
void reset();
-
template void reset(Y *p);
-
template void reset(Y *p, D d);
-
-
T &operator* () const; //同常规指针操作
-
T *operator->() const; //同常规指针操作
-
T *get() const;
-
-
bool unique() const; //是指针唯一所有者时返回true
-
long use_count() const; //多用于测试和调试
-
-
operator unspecified-bool-type() const; //在bool语境中隐式转换为bool值
-
void swap(shared_ptr & b);
-
}
shared_ptr还支持比较运算,比较是基于内部保存的指针,相当于a.get() == b.get(),同时支持<比较大小(其余比较不支持),这使得shared_ptr可用于标准容器set和map。
shared_ptr的智能使其行为最近进原始指针,比auto_ptr和scoped_ptr应用范围更广。shared_ptr也提供基本的线程安全保证,一个shared_ptr可以被多个线程安全读取。简单用法
shared_ptr sp(new int(10)); //指向int的shared_ptr sp.unique()为true
shared_ptr sp2 = sp; //拷贝构造函数sp.use_count 为2
sp.reset() //sp不再持有指针
shared_ptr作为函数参数时,可以直接拷贝,不用引用的方式传递,就像是使用原始的指针,只是引用计数变化。
void print_func(shared_ptr p)
{
cout << *p << endl;
}
print_func()函数内部拷贝了一个shared_ptr对象,但当退出函数时拷贝自动析构,引用计数总体不变。
阅读(816) | 评论(0) | 转发(0) |