设为首页 加入收藏

TOP

3.6.3 获得this的shared_ptr
2013-10-07 13:13:30 来源: 作者: 【 】 浏览:72
Tags:3.6.3 获得 this shared_ptr

3.6.3  获得this的shared_ptr

weak_ptr的一个重要用途是获得this指针的shared_ptr,使对象自己能够生产shared_ptr管理自己:对象使用weak_ptr观测this指针,这并不影响引用计数,在需要的时候就调用lock()函数,返回一个符合要求的shared_ptr供外界使用。

这个解决方案被实现为一个惯用法,在头文件<boost/enable_shared_from_this. hpp>定义了一个助手类enable_shared_from_this<T>,它的声明摘要如下:

  1. template<class T>  
  2. class enable_shared_from_this  
  3. {  
  4. public:  
  5.     shared_ptr<T> shared_from_this();  

使用的时候只需要让想被shared_ptr管理的类从它继承即可,成员函数shared_from_this()会返回this的shared_ptr。例如:

  1. #include <boost/enable_shared_from_this.hpp> 
  2. #include <boost/make_shared.hpp> 
  3. class self_shared:                          //一个需要用shared_ptr自我管理的类  
  4.     public enable_shared_from_this<self_shared> 
  5. {  
  6. public:  
  7.     self_shared(int n):x(n){}  
  8.     int x;  
  9.     void print()  
  10.     {   cout << "self_shared:" << x << endl;    }  
  11. };  
  12. int main()  
  13. {  
  14.     shared_ptr<self_shared> sp = make_shared<self_shared>(314);  
  15.     sp->print();  
  16.     shared_ptr<self_shared> p = sp->shared_from_this();  
  17.     p->x = 1000;  
  18.     p->print();  

需要注意的是千万不能从一个普通对象(非shared_ptr)使用shared_from_this()获取shared_ptr,例如:

  1. self_shared ss;  
  2. shared_ptr<self_shared> p = ss.shared_from_this();      //错误! 

这样虽然语法上正确,编译也无问题,但在运行时会导致shared_ptr析构时企图删除一个栈上分配的对象,发生未定义行为。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇3.2.1 类摘要 下一篇3.7 intrusive_ptr

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: