获得一个boost :: shared_ptr的这个获得一个boost :: shared_ptr的

2019-05-13 00:39发布

我正在广泛使用的boost:shared_ptr在我的代码。 事实上,大多数是在堆中分配的对象通过所保持shared_ptr 。 不幸的是,这意味着我无法通过this成需要的任何功能shared_ptr 。 考虑以下代码:

void bar(boost::shared_ptr<Foo> pFoo)
{
    ...
}

void Foo::someFunction()
{
    bar(this);
}

这里有两个问题。 首先,这将不会编译,因为对于T *构造shared_ptr是明确的。 其次,如果我强迫它来建立与bar(boost::shared_ptr<Foo>(this))我会创建一个第二个共享指针,以我的对象,最终将导致双删除。

这使我想起了我的问题:有没有得到任何标准模式从对这些对象的一个​​方法内部存在你知道现有的共享指针的副本? 是使用侵入式引用计数这里我唯一的选择?

Answer 1:

您可以从派生enable_shared_from_this ,然后你可以使用“shared_from_this()”而不是“本”,以一个共享指针产卵到你自己的对象。

实施例中的链接:

#include <boost/enable_shared_from_this.hpp>

class Y: public boost::enable_shared_from_this<Y>
{
public:

    shared_ptr<Y> f()
    {
        return shared_from_this();
    }
}

int main()
{
    shared_ptr<Y> p(new Y);
    shared_ptr<Y> q = p->f();
    assert(p == q);
    assert(!(p < q || q < p)); // p and q must share ownership
}

产卵从一个成员函数绑定线程的boost ::何时将shared_from_this()而不是此这是一个好主意。 这将确保对象不会被释放。



Answer 2:

只需使用原始指针您函数的参数,而不是shared_ptr的。 一个智能指针的目的是,以控制对象的生命周期,但对象寿命已经由C ++范围规则保证:它会为至少只要存在作为函数的末尾。 也就是说,你的函数返回前调用代码不可能删除对象; 因此,“哑”指针的安全性是有保证的,只要你不要试图删除自己的函数中的对象。

你需要传递一个shared_ptr成函数的唯一情况是,当你想通过对象的所有权的功能,或想要的功能,使指针的副本。



Answer 3:

提升对这种使用情况的解决方案,检查enable_shared_from_this



Answer 4:

你真的让里面的酒吧PFOO的多个共享副本? 如果你没有做任何疯狂的内部,只是这样做:


void bar(Foo &foo)
{
    // ...
}


Answer 5:

随着C ++ 11 shared_ptrenable_shared_from_this是现在的标准库。 后者,顾名思义,这种情况完全吻合。

http://en.cppreference.com/w/cpp/memory/shared_ptr

http://en.cppreference.com/w/cpp/memory/enable_shared_from_this

上,在上述的实施例的链接基地:

struct Good: std::enable_shared_from_this<Good>{
    std::shared_ptr<Good> getptr() {
        return shared_from_this();
    }
};

使用:

std::shared_ptr<Good> gp1(new Good);
std::shared_ptr<Good> gp2 = gp1->getptr();
std::cout << "gp2.use_count() = " << gp2.use_count() << '\n';


Answer 6:

接受指针的函数想要做两种行为之一:

  • 持有传递的对象 ,当它超出范围将其删除。 在这种情况下,你可以接受X *和立即环绕该对象scoped_ptr的(函数体)。 这将工作接受“这个”,或者在一般情况下,任何的堆分配的对象。
  • 分享指针 (不拥有它)在传递的对象。在这种情况下,你希望使用scoped_ptr的所有,因为你不希望你的函数结束时删除对象。 在这种情况下,理论上你想要的是一个shared_ptr(我已经看到它称为linked_ptr其他地方)。 Boost库有一个版本的shared_ptr的 ,而这还建议斯科特迈尔斯有效的C ++的书(在第3版第18项)。

编辑:哎呀我有点误解了问题,我现在看到这个答案是不完全解决的问题。 我会离开它无论如何,万一这可能是任何人在类似的代码的工作很有帮助。



文章来源: Getting a boost::shared_ptr for this
标签: c++ boost