- 类必须从std::enable_shared_from_this继承,并且T必须是类本身。
- 在类的成员函数中,可以通过调用shared_from_this()来获取一个指向自己的shared_ptr。
- 在使用shared_from_this()之前,必须确保存在至少一个shared_ptr对象来管理该类的生命周期,否则会抛出std::bad_weak_ptr异常。
- 不要在类的构造函数中调用shared_from_this(),因为在构造函数中shared_ptr还没有创建。
- enable_shared_from_this必须要public继承。
- 使用shared_ptr(pointer)来构建shared_ptr时没有考虑指针指向的实际对象,没有多态性,这可能会引起一些隐秘的错误,下面是一个例子:
#include <iostream>
#include <memory>
using namespace std;
class Base
{
virtual void baseVTable() {}; //模拟基类是一个多态类型,否则dynamic_cast报错
};
class Derived : virtual public Base, public enable_shared_from_this<Derived>
{
public:
int a = 10;
void test()
{
cout << shared_from_this()->a << endl;
}
};
int main()
{
auto childSPtr = make_shared<Derived>();
childSPtr->test(); //输出10
Base* ptr = new Derived();
shared_ptr<Base> sPtr = shared_ptr<Base>(ptr);
shared_ptr<Derived> derivedSPtr = dynamic_pointer_cast<Derived>(sPtr);
derivedSPtr->test(); //报错
}
在这个例子中,使用指向子类实例的父类指针去创建shared_ptr时,shared_ptr()不知道这个父类指针指向的对象实际上继承了enable_shared_from_this,也就没有做相应的赋值,shared_from_this()会产生报错。
先创建子类的shared_ptr后再转换为父类的shared_ptr就能避免报错。