我正在广泛使用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))
我将创建第二个指向我的对象的共享指针,这最终将导致双重删除。
这让我想到了我的问题:是否有任何标准模式可以从这些对象之一的方法内部获取您知道存在的现有共享指针的副本?使用侵入式引用计数是我唯一的选择吗?
你可以从启用_shared_from_this http://www.boost.org/doc/libs/1_36_0/libs/smart_ptr/enable_shared_from_this.html然后您可以使用“shared_from_this()”而不是“this”来生成指向您自己的 self 对象的共享指针。
链接中的示例:
#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() 而不是 this 时,这是一个好主意。它将确保该对象不被释放。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)