为什么我们需要enabled_shared_from_this

Dev*_*Dev 1 c++ boost shared-ptr

我正在研究shared_ptr和enable_shared_from_this的boost文档,我无法弄清楚enable_shared_from_this的实际用途.

以下是我对enable_shared_from_this的理解(示例复制自`enable_shared_from_this`的有用性是什么?).

class Y: public enable_shared_from_this<Y>
{
    public:
      Y(): count(3){}
      shared_ptr<Y> f()
      {
         return shared_from_this();
      }
      int count;
}

int main()
{
    shared_ptr<Y> p(new Y);
    shared_ptr<Y> q = p->f();
    cout << "\n Count from P is " << p1->count;
    cout << "\n Count from q is " << q1->count;
}
Run Code Online (Sandbox Code Playgroud)

所以,现在我们有一个共享指针q,它指向p(new Y)所拥有的同一个对象,当p和q超出范围时,对象被销毁.上面的两个打印语句都将打印3作为计数.

现在,通过执行以下操作,我可以在不使用enable_shared_from_this的情况下实现相同的功能.

class Y
{
    public:
      Y(): count(3){}
      int count;
}

int main()
{
    shared_ptr<Y> p(new Y);
    shared_ptr<Y> q(p);
    cout << "\n Count from P is " << p1->count;
    cout << "\n Count from q is " << q1->count;
}
Run Code Online (Sandbox Code Playgroud)

即使在上面的例子中,P和Q都指向同一个对象并将打印3.

那么,使用enable_shared_from_this,我获得了什么好处?

Ker*_* SB 8

shared_from_this是一种非常特殊的动物.通常,你应该分开责任:一个班做一件事,一件事做.拥有一个资源是一种责任,所以一个类应该拥有一个资源而不做任何其他事情,或者做一些事情但不拥有资源.

用法shared_from_this是在违反此原则时,类知道它由共享指针拥有.在这种情况下,您需要一种方法来获取拥有您的环境共享指针.您不能简单地说shared_ptr<T>(this),因为这将创建一个新的所有者,而不是与现有所有者共享所有权.

要从类通信到其环境所有者,您需要派生自enable_shared_from_this,然后用于shared_from_this生成新的股东.

(这实际上通过向weak_ptr<T>类添加成员来实现,并且在创建环境共享指针时,该弱指针被设置为观察共享指针.因此对弱指针shared_from_this进行简单的lock()调用.)


这是一个澄清用法的例子:

auto x = std::make_shared<T>();
f(*x);

// ...

void f(T const & t)
{
    auto y = t.shared_from_this();
    // ...
}
Run Code Online (Sandbox Code Playgroud)

在里面f,我们不会t立即看到所有者,而是shared_from_this将其带出来.