获取共享 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
拥有了对象。