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