【问题标题】:Why we need enabled_shared_from_this [duplicate]为什么我们需要 enabled_shared_from_this [重复]
【发布时间】:2013-12-17 03:58:21
【问题描述】:

我正在查看 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 有什么好处?

【问题讨论】:

  • 您在指向的示例中没有提到count。回答者的意思是内部的shared_ptr 计数。
  • 一个疯狂的想法:shared_from_this 是使用delete this 的旧 C++ 代码的某种“成人版”;即它吸引了同样肮脏的头脑。
  • @g-makulik - 我相信我的问题与之前在 SO 中提出的问题不同。我的问题是,上面的两个示例都为对象 Y 提供了共享所有权。在这种情况下,我们为什么要使用 enable_shared_from_this?与第二个示例相比,enable_shared_from_this 提供了什么好处?
  • @devana 很好地解释了为什么它是必要的和有用的,我没有看到你的问题在另一个问题之上增加了任何价值。这不仅仅是重新措辞和稍微改变样本,而是构成了一个新问题。

标签: c++ boost shared-ptr


【解决方案1】:

shared_from_this 是一种非常特别的动物。通常,您应该分离职责:一个类做一件事,而且只做一件事。拥有资源就是这样一种责任,所以一个类要么拥有资源但不做任何其他事情,要么做其他事情但不拥有资源。

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

要从类与其环境所有者通信,您需要从enable_shared_from_this 派生,然后使用shared_from_this 生成新股东。

(这实际上是通过向类添加一个weak_ptr&lt;T&gt; 成员,并在创建环境共享指针时,将该弱指针设置为观察共享指针。所以shared_from_this 是一个简单的lock() 调用弱指针。)


这里有一个例子来说明用法:

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

// ...

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

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

【讨论】:

  • 我的理解是,第二个示例提供的问题与第一个示例中的 enable_shared_from_this 提供的共享所有权相同。我这样想对吗?如果这两个示例都提供对象的共享所有权,我为什么要使用 enable_shared_from_this ?
  • @devana:当然,但是在第二个示例中,您在作弊并且您已经拥有pshared_from_this 适用于只有*p(或p-&gt;)的情况!我添加了一个示例。
  • 感谢第二个例子。这就很清楚了。
  • 投反对票的人,想解释一下你的反对意见吗?
【解决方案2】:

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

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

【讨论】:

  • shared_from_this 是一个重要的习惯用法,例如,在创建绑定到 this 的匿名函子并将它们传递给异步子系统时。
猜你喜欢
  • 1970-01-01
  • 2019-06-09
  • 2011-12-12
  • 1970-01-01
  • 2016-04-27
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
相关资源
最近更新 更多