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>,它的声明摘要如下:
- template<class T>
- class enable_shared_from_this
- {
- public:
- shared_ptr<T> shared_from_this();
- }
使用的时候只需要让想被shared_ptr管理的类从它继承即可,成员函数shared_from_this()会返回this的shared_ptr。例如:
- #include <boost/enable_shared_from_this.hpp>
- #include <boost/make_shared.hpp>
- class self_shared: //一个需要用shared_ptr自我管理的类
- public enable_shared_from_this<self_shared>
- {
- public:
- self_shared(int n):x(n){}
- int x;
- void print()
- { cout << "self_shared:" << x << endl; }
- };
- int main()
- {
- shared_ptr<self_shared> sp = make_shared<self_shared>(314);
- sp->print();
- shared_ptr<self_shared> p = sp->shared_from_this();
- p->x = 1000;
- p->print();
- }
需要注意的是千万不能从一个普通对象(非shared_ptr)使用shared_from_this()获取shared_ptr,例如:
- self_shared ss;
- shared_ptr<self_shared> p = ss.shared_from_this(); //错误!
这样虽然语法上正确,编译也无问题,但在运行时会导致shared_ptr析构时企图删除一个栈上分配的对象,发生未定义行为。