【问题标题】:boost.enable_shared_from_this and create another shared_ptr<T>boost.enable_shared_from_this 并创建另一个 shared_ptr<T>
【发布时间】:2014-12-16 13:52:13
【问题描述】:

最近,我遇到了一个关于 boost 智能指针的问题。要指定,enable_shared_from_this 为类 T 保留一个“this”shared_ptr。当 T 的实例超出范围时,enable_shared_from_this 仍然存在。但是我创建一个原始 ptr 的 shared_ptr 的新对象呢?又有什么区别呢?

非常感谢。

class Foo : public boost::enable_shared_from_this<Foo>
{};

int main() {
  shared_ptr<Foo> p1(new Foo);
  shared_ptr<Foo> p2 = p1->shared_from_this();
  shared_ptr<Foo> p3 = shared_ptr<Foo>(p1);

  p1.reset();
  // p1 is released, p2 and p3 still remains.
  // but what is the diff between p2 and p3?
  // Can I say shared_from_this() works the same way as
  // shared_ptr<Foo>(p1);
}

【问题讨论】:

    标签: c++ boost shared-ptr


    【解决方案1】:

    当你的新指针超出范围时,它可能会导致你的程序崩溃。原因是 shared_ptr 通过计算对它的引用来控制对象的生命周期。每次复制 shared_ptr 它都会增加引用计数,每次 shared_ptr 对象超出范围时,它都会减少引用计数。当引用计数达到零时,它将删除对象。当您在类方法中创建的shared_ptr 超出范围时,它将删除它,因为引用计数将为零。

    所以应该使用shared_from_this,当你需要在类成员函数中使用shared_ptr,而在任何其他情况下,你可以只使用指向对象的共享指针。

    考虑这个例子:

    class Y
    {
    public:
    
        shared_ptr<Y> f()
        {
            return shared_ptr<Y>(this);
        }
    }
    

    如果你在这里返回普通共享指针,你会为同一个指针创建多个shared_ptrs,然后在某个时候删除this,同时让所有其他shared_ptr实例悬空(指向某个已删除)。 所以,正确的版本是:

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

    【讨论】:

    • 非常感谢。我明白你的意思。这是否意味着 shared_from_this() 将始终保留指向实例的链接,即使该实例离开某个地方?
    • 只要保持对 shared_from_this 的引用,对象就会存在。这意味着如果您执行以下操作 auto ref = Yinstance.f();并持有 ref,对象也将是活动的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 2018-02-19
    • 2011-09-29
    相关资源
    最近更新 更多