为什么我们需要enable_shared_from_this

时间:2013-12-01 11:04:03

标签: c++ boost shared-ptr

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

以下是我对enable_shared_from_this的理解(从What is the usefulness of `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;
}

所以,现在我们有一个共享指针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;
}

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

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

2 个答案:

答案 0 :(得分: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() {1}}对弱指针的调用。)


以下是澄清用法的示例:

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

// ...

void f(T const & t)
{
    auto y = t.shared_from_this();
    // ...
}

f内,我们没有立即看到t的所有者,但是shared_from_this将其带出来。

答案 1 :(得分:0)

利益是结构化的问题。在您的示例中,拥有q的人可能对拥有p的人一无所知或有权访问。有时更容易从类型中获取另一个shared_ptr到同一个实例(在本例中为Y)。

那就是说,我个人从不使用enable_shared_from_this。就我而言,它与单身人士在同一条船上。