shared_from_this()

1. shared_from_this()使用场合

  • 在一个类中需要传递类对象本身shared_ptr的地方使用shared_from_this函数来获得指向自身的shared_ptr,它是enable_shared_from_this的成员函数,返回shared_ptr。

  • 这个函数仅在shared_ptr的构造函数被调用之后才能使用。原因是enable_shared_from_this::weak_ptr并不在enable_shared_from_this构造函数中设置,而是在shared_ptr的构造函数中设置。

2. 例子

(a) 如下代码是错误的:

    class D:public boost::enable_shared_from_this<D>  
    {  
    public:  
        D()  
        {  
            boost::shared_ptr<D> p=shared_from_this();  
        }  
    };  
 原因:在D的构造函数中虽然可以保证enable_shared_from_this<D>的构造函数已经被调用,
     但正如前面所说,weak_ptr还没有设置。

(b)如下代码也是错误的:

    class D:public boost::enable_shared_from_this<D>  
    {  
    public:  
        void func()  
        {  
            boost::shared_ptr<D> p=shared_from_this();  
        }  
    };  
    void main()  
    {  
        D d;  
        d.func();  
    }  
    原因:同上。

(3) 正确使用如下
    void main()  
    {  
        boost::shared_ptr<D> d(new D);  
        d->func();  
    }  
    原因:
    这里boost::shared_ptr<D> d(new D)实际上执行了3个动作:
        1. 首先调用enable_shared_from_this<D>的构造函数;
        2. 其次调用D的构造函数;
        3. 最后调用shared_ptr<D>的构造函数。
    是第3个动作设置了enable_shared_from_this<D>的weak_ptr,而不是第1个动作。
    这个地方是很违背c++常理和逻辑的,必须小心。 

3. 总结

  • 不要在构造函数中使用shared_from_this。
  • 如果要使用shared_ptr,则应该在所有地方均使用,不能使用D d这种方式,也决不要传递裸指针。
  • 如果要使用shared_ptr, 那么类的内部不直接使用this指针,因为我们程序中用shared_ptr来管理指针,如果我们在类的内部传递的过程中用原始指针,这样类内部的引用shared_ptr不会察觉到,因为有可能this传进去的时候已经被shared_ptr释放掉了。

参考文献:
[1] http://blog.csdn.net/rain_qingtian/article/details/10829249 作者:Rain-晴天
[2] http://blog.csdn.net/salutlu/article/details/12515877 作者:salutlu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值