【问题标题】:std::enable_shared_from_this ... Does a new shared_ptr know to take shared_from_this()?std::enable_shared_from_this ... 新的 shared_ptr 是否知道使用 shared_from_this()?
【发布时间】:2011-05-17 12:05:05
【问题描述】:

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

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

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

【问题讨论】:

标签: c++ boost shared-ptr


【解决方案1】:
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 对象,不存在其他单独的共享指针计数。

【讨论】:

  • 那么,如果你有一个指向它的共享指针,为什么要使用shared_from_this(),只需要传递shared_pointer?我错过了重点......
  • @YochaiTimmer:是的,这通常是更好的方法。 shared_from_this() 仅允许您处理必须通过接口传递原始指针并希望检索共同拥有它的共享指针的情况,前提是您知道该对象已经存在由共享指针拥有。
  • enable_shared_from_this 创建了一个本地成员 weak_ptr 来监视“this” .... 那么,如果它已经监视了“this”(从构造中),为什么不能从中创建 shared_ptr 呢?
  • 我不确定我是否理解您的问题,您是在询问std::enable_shared_from_this 的具体实现吗?
  • 没关系,谢谢... boost 文档:“必须至少存在一个 shared_ptr 实例 p 拥有 t。”
猜你喜欢
  • 1970-01-01
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多