您的位置:首页 > 其它

boost::shared_from_this值得注意的地方

2013-09-01 16:22 363 查看
shared_from_this()在一个类中需要传递类对象本身shared_ptr的地方使用shared_from_this函数来获得指向自身的shared_ptr,它是enable_shared_from_this<T>的成员函数,返回shared_ptr<T>。
首先需要注意的是:这个函数仅在shared_ptr<T>的构造函数被调用之后才能使用。原因是enable_shared_from_this::weak_ptr并不在enable_shared_from_this<T>构造函数中设置,而是在shared_ptr<T>的构造函数中设置。 
a) 如下代码是错误的:

[cpp] view
plaincopyprint?

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) 如下代码也是错误的:

[cpp] view
plaincopyprint?

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();  

}  

错误原因同上。 
c) 如下代码是正确的:

[cpp] view
plaincopyprint?

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++常理和逻辑的,必须小心。 

结论是:不要在构造函数中使用shared_from_this;其次,如果要使用shared_ptr,则应该在所有地方均使用,不能使用D d这种方式,也决不要传递裸指针。   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: