Chinaunix首页 | 论坛 | 博客
  • 博客访问: 703411
  • 博文数量: 102
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 1748
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-23 15:42
个人简介

寻找严肃、沉默和专注的力量。

文章分类

全部博文(102)

文章存档

2015年(26)

2014年(8)

2013年(68)

分类: C/C++

2013-07-11 20:30:48

shared_ptr
   
smart_ptr中最重要最有用的计数型智能指针,可以被自由地拷贝和赋值,在任意的地方共享,引用计数为0时才删除被包装的动态对象,同时shared_ptr可以安全的放到标准容器中。以下是类摘要和注解:    

点击(此处)折叠或打开

  1. template<class T> class shared_ptr
  2. {
  3. public:
  4.     typedef T element_type;
  5.     
  6.     shared_ptr();
  7.     template<class Y> explicit shared_ptr(Y *p);                    //引用计数置为1
  8.     template<class Y, class D> shared_ptr(Y *p,d);
  9.     ~shared_ptr();

  10.     shared_ptr(shared_ptr const &r);
  11.     template explicit shared_ptr(std::auto_ptr &r);
  12.     
  13.     shared_ptr &operator=(shared_ptr const &r);                    //从另一个shared_ptr获得指针管理权,引用计数+1
  14.     template shared_ptr &operator=(shared_ptr const &r);
  15.     template shared_ptr &operator=(std::auto_ptr &r);  //从一个auto_ptr获得指针管理权,同时auto_ptr失去管理权
  16.     
  17.     void reset();
  18.     template void reset(Y *p);
  19.     template void reset(Y *p, D d);
  20.     
  21.     T &operator* () const;                                   //同常规指针操作
  22.     T *operator->() const;                                   //同常规指针操作
  23.     T *get() const;
  24.     
  25.     bool unique() const;                                     //是指针唯一所有者时返回true
  26.     long use_count() const;                                  //多用于测试和调试
  27.    
  28.     operator unspecified-bool-type() const;                   //在bool语境中隐式转换为bool值
  29.     void swap(shared_ptr & b);
  30. }

    shared_ptr还支持比较运算,比较是基于内部保存的指针,相当于a.get() == b.get(),同时支持<比较大小(其余比较不支持),这使得shared_ptr可用于标准容器set和mapshared_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对象,但当退出函数时拷贝自动析构,引用计数总体不变。
阅读(773) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~