获取共享 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); // First prepare a shared pointer to the object and hold it!
// Then get a shared pointer to the object from the object itself
shared_ptr<A> ap3 = ap1->shared_from_this(); 
int c3 =ap3.use_count(); // =2: pointing to the same object

注意 (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_ptr 的对象上使用 shared_from_this(),例如本地自动对象或全局对象,则行为未定义。从 C++ 17 开始,它会抛出 std::bad_alloc

使用构造函数中的 shared_from_this() 相当于在不属于 shared_ptr 的对象上使用它,因为构造函数返回后 shared_ptr 拥有了对象。