标准::enable_shared_from_this ..新shared_ptr知道服用shared_from_thi

std::enable_shared_from_this ... Does a new shared_ptr know to take shared_from_this()?

本文关键字:shared from thi this enable 标准 ptr      更新时间:2023-10-16

我有一个派生自enable_shared_from_this的类...(最近从 Boost 添加到标准)

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

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

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对象不存在其他单独的共享指针计数。