假设我有:
class Foo
{
public:
Foo(std::function< void(std::shared_ptr< Foo >) > callback);
void shareMyFoo()
{
callback(std::make_shared< Foo >(this));
}
....
};
调用shareMyFoo()
时,有人将有机会复制共享指针。不幸的是,由于它会死——也就是说,它的ref计数器降到了0——它会杀死我的Foo。我想防止Foo
自杀。
我想在Foo
中有一个字段std::shared_ptr< Foo > sharedSelf_
,我会在构造函数中初始化它,但这也很便宜。
更一般地说,假设我实例化并存储一个指向共享指针中对象的指针(例如auto foo = std::make_shared< Foo >()
),然后该实例希望将自己作为共享指针传递。如何全局更新ref计数器?
N.B.:我希望/需要在我的应用程序上保留我的签名/我的shared_ptr参数。
您必须从std::enable_shared_from_this
继承(n3242§20.7.2.4)。
auto p = (new Foo) -> shared_from_this ();
查找enable_shared_from_this
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());
}
};