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

Yoc*_*mer 3 c++ boost shared-ptr

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

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

};
Run Code Online (Sandbox Code Playgroud)

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

Blah* b = new Blah();
std::shared_ptr<Blah> good(b->shared_from_this());
Run Code Online (Sandbox Code Playgroud)

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

std::shared_ptr<Blah> bad(new Blah());
Run Code Online (Sandbox Code Playgroud)

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

CB *_*ley 9

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

这是不正确的.为了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
Run Code Online (Sandbox Code Playgroud)

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

std::shared_ptr<Blah> good(b);
Run Code Online (Sandbox Code Playgroud)

没有任何内在错误:

std::shared_ptr<Blah> bad(new Blah());
Run Code Online (Sandbox Code Playgroud)

因为new B()创建新的,B所以对于新创建的B对象,不存在其他单独的共享指针计数.

  • @YochaiTimmer:是的,这通常是一种更好的方法.`shared_from_this()`只是允许你应对必须通过接口传递原始指针并希望检索共享它的共享指针的情况,前提是你知道对象已经被共享指针拥有了. (3认同)