std :: enable_shared_from_this ...新的shared_ptr是否知道采用shared_from_this()?

时间:2011-05-17 12:05:05

标签: c++ boost shared-ptr

我有一个派生自enable_shared_from_this的课程......(最近被添加到Boost的std中)

class Blah : public std::enable_shared_from_this<Blah>
{

};

我知道我应该从像这样的实例创建共享指针:

Blah* b = new Blah();
std::shared_ptr<Blah> good(b->shared_from_this());

问题是,如果我做这样的事情,是否会隐含地使用对象的weak_ptr:

std::shared_ptr<Blah> bad(new Blah());

或者它只是创建一个单独的共享指针计数器? (我怀疑)

1 个答案:

答案 0 :(得分:9)

Blah* b = new Blah();
std::shared_ptr<Blah> good(b->shared_from_this()); // bad, *b is not yet owned

这是不正确的。要使shared_from_this生效,b必须至少拥有一个shared_ptr。你必须使用:

std::shared_ptr<Blah> b = new B();
Blah* raw = b.get();
std::shared_ptr<Blah> good(raw->shared_from_this()); // OK because *raw is owned

当然,在这个简单的例子中,它更容易使用:

std::shared_ptr<Blah> good(b);

没有任何内在错误:

std::shared_ptr<Blah> bad(new Blah());

由于new B()创建了新的B,因此新创建的B对象不存在其他单独的共享指针计数。