C++ 获取一个shared_ptr引用这个

示例

enable_shared_from_this使您可以获取的有效shared_ptr实例this。

通过从类模板派生类enable_shared_from_this,您继承了一个shared_from_this将shared_ptr实例返回的方法this。

请注意,必须首先将对象创建为shared_ptr:

#include <memory>
class A: public enable_shared_from_this<A> {
};
A* ap1 =new A();
shared_ptr<A> ap2(ap1); // 首先准备指向该对象的共享指针并保持它!
// 然后从对象本身获取指向该对象的共享指针
shared_ptr<A> ap3 = ap1->shared_from_this(); 
int c3 =ap3.use_count(); // = 2:指向同一对象

注意(2)您不能enable_shared_from_this在构造函数内部调用。

#include <memory> // enable_shared_from_this

class Widget : public std::enable_shared_from_this< Widget >
{
public:
    void DoSomething()
    {
        std::shared_ptr< Widget > self = shared_from_this();
        someEvent -> Register( self );
    }
private:
    ...
};

int main()
{
    ...
    auto w = std::make_shared< Widget >();
    w -> DoSomething();
    ...
}

如果shared_from_this()在非拥有的对象上使用shared_ptr,例如本地自动对象或全局对象,则行为是不确定的。从C ++ 17开始,它抛出std::bad_alloc。

使用shared_from_this()从构造函数等同于使用它不是由拥有的对象shared_ptr,因为对象是由拥有shared_ptr构造函数返回后。