获取一个boost :: shared_ptr为此

我在我的代码中广泛使用boost:shared_ptr 。 实际上,在堆上分配的大部分对象都是由shared_ptr 。 不幸的是,这意味着我不能将this传递给任何需要shared_ptr函数。 考虑这个代码:

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

这里有两个问题。 首先,这不会编译,因为shared_ptr的T *构造函数是显式的。 其次,如果我强制它与bar(boost::shared_ptr<Foo>(this))我将创build第二个共享指针到我的对象,最终将导致双删除。

这使我想到了我的问题:是否有任何标准模式获取您知道的现有共享指针的副本存在于这些对象之一的方法内? 使用侵入性的引用计数我唯一的select在这里?

你可以从enable_shared_from_this派生,然后你可以使用“ shared_from_this ()”而不是“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 :: bind到shared_from_this()而不是这个时,这是个好主意。 这将确保对象不被释放。

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

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

boost有这个用例的解决scheme,请查看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,因为你不想在函数结尾删除这个对象。 在这种情况下,你理论上需要的是一个shared_ptr(我已经看到它在别处称为linked_ptr)。 boost库有一个shared_ptr的版本, Scott Meyers的Effective C ++书籍(第3版第18项)也推荐使用这个版本。

编辑:哎呀,我有点误解了这个问题,我现在看到这个答案并不完全解决这个问题。 无论如何,我会放弃它,以防止这可能有助于任何人在类似的代码工作。