说我有:
class Foo
{
public:
Foo(std::function< void(std::shared_ptr< Foo >) > callback);
void shareMyFoo()
{
callback(std::make_shared< Foo >(this));
}
....
};
调用shareMyFoo()
时,有人将有机会复制共享指针。不幸的是,因为它会死 - 也就是说,它的参考计数器降到0--它会杀死我的Foo。我想阻止Foo
被自杀。
我想在std::shared_ptr< Foo > sharedSelf_
中有一个字段Foo
,我会在构造函数中初始化,但这也很便宜。
更一般地说,假设我实例化并存储指向共享指针中的对象的指针,例如(auto foo = std::make_shared< Foo >()
),稍后实例想要将自身作为共享指针传递。如何全局更新ref计数器?
N.B。:我希望/需要在我的应用程序中保留我的签名/我的shared_ptr参数。
答案 0 :(得分:3)
你必须继承std::enable_shared_from_this
(n3242§20.7.2.4)。
auto p = (new Foo) -> shared_from_this ();
答案 1 :(得分:3)
class Foo : public std::enable_shared_from_this<Foo>
{
Foo(std::function< void(std::shared_ptr< Foo >) > callback);
public:
std::shared_ptr<Foo> create(std::function< void(std::shared_ptr< Foo >) > callback)
{
return std::shared_ptr<Foo>(new Foo(std::move(callback)));
}
void shareMyFoo()
{
callback(shared_from_this());
}
};