我有一个派生自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());
或者它只是创建一个单独的共享指针计数器? (我怀疑)
答案 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
对象不存在其他单独的共享指针计数。