獲取共享 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 擁有了物件。