我boost:shared_ptr
在我的代码中广泛使用.实际上,堆上分配的大多数对象都是由a保存的shared_ptr
.不幸的是,这意味着我无法传递this
任何需要的函数shared_ptr
.考虑以下代码:
void bar(boost::shared_ptrpFoo) { ... } void Foo::someFunction() { bar(this); }
这里有两个问题.首先,这不会编译,因为T*构造函数shared_ptr
是显式的.其次,如果我强制它构建,bar(boost::shared_ptr
我将创建第二个指向我的对象的共享指针,最终将导致双删除.
这让我想到了一个问题:是否有任何标准模式可以从其中一个对象的方法中获取您知道的现有共享指针的副本?使用侵入式引用计数是我唯一的选择吗?
您可以从enable_shared_from_this派生,然后您可以使用" shared_from_this()"而不是"this"来生成指向您自己的自身对象的共享指针.
链接示例:
#includeclass Y: public boost::enable_shared_from_this { public: shared_ptr f() { return shared_from_this(); } } int main() { shared_ptr p(new Y); shared_ptr 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_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{ std::shared_ptr getptr() { return shared_from_this(); } };
使用:
std::shared_ptrgp1(new Good); std::shared_ptr gp2 = gp1->getptr(); std::cout << "gp2.use_count() = " << gp2.use_count() << '\n';