如何在C++中通过我的应用程序共享"this"实例?



假设我有:

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());
    }
};

相关内容

最新更新