为什么需要boost::enable_shared_from_this?

1. class
2.   
3. shared_ptr<cat> p(new
4. shared_ptr<cat> p2(p);  
5.   
6.   
7.   
8. class cat:public
9.   
10. shared_ptr<cat> p(new
11. shared_ptr<cat> p2=p->shared_from_this();




这两段代码看似没什么区别。但是如果你在程序里,比如在cat中的成员方法中,有的只是cat的raw pointer,但你依然想利用shared_ptr的自动delete特性,又不想自己防止由于存在多个shared_ptr<cat>对同一个cat对象delete多次的危险。即多个shared_ptr<cat>共用同一个计数器。这时候,boost::enable_shared_frome_this就变得很方便了。 



EnableConfigurationProperties 数组 enable_from_this_g++

1. struct
2.   
3. void f(shared_ptr<A> const&) {...}  
4.   
5. struct A: public
6. {  
7. void
8.     {  
9. // you need to call f() here passing itself as a parameter
10.         f(shared_from_this());  
11.     }  
12. };  
13.   
14. shared_ptr<A> a_ptr(new
15. a_ptr->a_f(); // in inner call to f() will be used temporary shared_ptr<A> 
16. // that uses (shares) the same reference counter as a_ptr




boost::enable_shared_from_this原理

 



其实继承了boost::enable_shared_from_this的类,真正的magic是发生在创建它的第一个shared_ptr实例时。shared_ptr会反调boost::enable_shared_from_this的_internal_accept_owner方法。 


EnableConfigurationProperties 数组 enable_from_this_g++

1. template<class T> class
2. {  
3. protected:  
4.   
5.     enable_shared_from_this()  
6.     {  
7.     }  
8.   
9. const
10.     {  
11.     }  
12.   
13. const
14.     {  
15. return *this;  
16.     }  
17.   
18.     ~enable_shared_from_this()  
19.     {  
20.     }  
21.   
22. public:  
23.   
24.     shared_ptr<T> shared_from_this()  
25.     {  
26.         shared_ptr<T> p( weak_this_ );  
27. this
28. return
29.     }  
30.   
31. const> shared_from_this() const
32.     {  
33. const> p( weak_this_ );  
34. this
35. return
36.     }  
37.   
38. public: // actually private, but avoids compiler template friendship issues
39.   
40. // Note: invoked automatically by shared_ptr; do not call
41. template<class X, class Y> void _internal_accept_owner( shared_ptr<X> const * ppx, Y * py ) const
42.     {  
43. if( weak_this_.expired() )  
44.         {  
45.             weak_this_ = shared_ptr<T>( *ppx, py );  
46.         }  
47.     }  
48.   
49. private:  
50.   
51. mutable
52. };  
53.   
54. //从源码中,可以看出,重点不在于初始化的时候。而是在于创建第一个该对象的shared_ptr的时候:
55.   
56. template<class
57. explicit shared_ptr( Y * p ): px( p ), pn( p ) // Y must be complete
58. {  
59. this, p, p );  
60. }  
61.   
62. template< class X, class Y, class T > inline void sp_enable_shared_from_this( boost::shared_ptr<X> const * ppx, Y const * py, boost::enable_shared_from_this< T > const
63. {  
64. if( pe != 0 )  
65.     {  
66. const_cast< Y* >( py ) );  
67.     }  
68. }


weak_ptr是为配合shared_ptr而引入的一种智能指针来协助shared_ptr工作,它可以从一个shared_ptr或另一个weak_ptr对象构造,它的构造和析构不会引起引用记数的增加或减少。没有重载*和->但可以使用lock获得一个可用的shared_ptr对象



weak_ptr的一个重要用途是通过lock获得this指针的shared_ptr,使对象自己能够生产shared_ptr来管理自己,但助手类enable_shared_from_this的shared_from_this会返回this的shared_ptr,只需要让想被shared_ptr管理的类从它继承即可




    noncopyable允许程序轻松地实现一个禁止复制的类,位于名字空间boost,为了使用 noncopyable组件,需要包含头文件<boost/noncopyable.hpp>或者<boost/utility.hpp>,后者包含了数个小工具的实现:

从原理来上说就是将拷贝构造函数和拷贝赋值操作符声明为private,未免重复写这种乏味代码,可以直接继承自noncopyable




如下:



此处)折叠或打开

1. #include <boost/utility.hpp>
2.  
3. class do_not_copy: boost::noncopyable
4. {
5. };
6.  
7. int main()
8. {
9. ;
10. (d1);
11. = d1;
12. ;
13. }



g++ 编译报错:

boost::noncopyable_::noncopyable::noncopyable(const boost::noncopyable_::noncopyable&)’ is private



补充:


如果成员函数中用到shared_from_this(),则须通过shared_ptr<>创建该类实例,要么该类就别派生enable_shared_from_this,成员函数中直接使用this。