我正在广泛使用的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 ,然后你可以使用“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()而不是此这是一个好主意。 这将确保对象不会被释放。
只需使用原始指针您函数的参数,而不是shared_ptr的。 一个智能指针的目的是,以控制对象的生命周期,但对象寿命已经由C ++范围规则保证:它会为至少只要存在作为函数的末尾。 也就是说,你的函数返回前调用代码不可能删除对象; 因此,“哑”指针的安全性是有保证的,只要你不要试图删除自己的函数中的对象。
你需要传递一个shared_ptr成函数的唯一情况是,当你想通过对象的所有权的功能,或想要的功能,使指针的副本。
提升对这种使用情况的解决方案,检查enable_shared_from_this
你真的让里面的酒吧PFOO的多个共享副本? 如果你没有做任何疯狂的内部,只是这样做:
void bar(Foo &foo)
{
// ...
}
随着C ++ 11 shared_ptr
和enable_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的所有,因为你不希望你的函数结束时删除对象。 在这种情况下,理论上你想要的是一个shared_ptr(我已经看到它称为linked_ptr其他地方)。 Boost库有一个版本的shared_ptr的 ,而这还建议斯科特迈尔斯有效的C ++的书(在第3版第18项)。
编辑:哎呀我有点误解了问题,我现在看到这个答案是不完全解决的问题。 我会离开它无论如何,万一这可能是任何人在类似的代码的工作很有帮助。