我制作广泛的使用 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)) 我已经创建了第二共享的指针指向我的对象,这将最终导致双删除。

这使我想到我的问题:是否有任何标准的模式越来越复制的现有共用的指针,你知道存在从内部的一种方法上的那些对象?是利用侵入性的参考指望我的唯一选择在这里?

有帮助吗?

解决方案

您可以从 enable_shared_from_this 派生,然后您可以使用<!> quot; shared_from_this()<!> quot;而不是<!>“;这个<!>”;生成一个指向你自己的自我对象的共享指针。

链接中的示例:

#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 :: bind到shared_from_this()而不是这个时,这是一个好主意。它将确保不释放对象。

其他提示

只需使用函数参数的原始指针而不是shared_ptr。智能指针的目的是控制对象的生命周期,但C ++作用域规则已经保证了对象的生命周期:它至少与函数结束一样长。也就是说,调用代码不能在函数返回之前删除对象;因此,“哑”的安全性。只要您不尝试删除函数内的对象,就可以保证指针。

您需要将shared_ptr传递给函数的唯一时间是您希望将对象的所有权传递给函数,或者希望函数复制指针。

boost有针对此用例的解决方案,请查看 enable_shared_from_this

你真的在酒吧内制作更多pFoo的共享副本吗?如果你内心没有做任何疯狂的事情,那就这样做:


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

使用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';

功能接受一个指想要做一个的两个行为:

  • 自己的对象 正在通过,以及删除它的时候它超出范围。在这种情况下,你可以接受的X*和立即裹scoped_ptr周围,对象(在功能的身体)。这将工作,接受"这种"或在一般情况下,任何堆分配的对象。
  • 共享一个指 (不要自己的话)的目的是通过。在这种情况下你做的 想要使用scoped_ptr,因为你不想要删除的对象在结束你的功能。在这种情况下,什么你从理论上讲要是一个情况(我已经看到了它称为一个linked_ptr其他地方).该提高图书馆 一个版本的情况, ,此外,还建议在斯科特*梅尔'有效C++书(项目18的第3版)。

编辑: 哎呀我稍误解的问题,我现在看到的这个答复是不完全解决的问题。我会离开,无论如何,在这种情况下,可能有助于工作的人在类似的代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top