用途
struct S
{shared_ptr<S> dangerous(){return shared_ptr<S>(this); // don't do this!}
};int main()
{shared_ptr<S> sp1(new S);shared_ptr<S> sp2 = sp1->dangerous();return 0;
}
考虑以上代码,从一个被shared_ptr管理的struct中返回一个shared_ptr,明显这是有问题的,两个shared_ptr管理的是同一个this,会free两次,那么本质上就是,当我们有用一个this指针时,如何得到对应的shared_ptr呢
struct S : enable_shared_from_this<S>
{shared_ptr<S> not_dangerous(){return shared_from_this();}
};int main()
{shared_ptr<S> sp1(new S);shared_ptr<S> sp2 = sp1->not_dangerous();return 0;
}
如此便可,可以看到继承一个enable_shared_from_this
就可以实现,这种模板类可能少见,因为继承的父类的模板参数是子类,这是因为父类需要知道子类的类型去生成对应的函数. 这种称为奇异递归模板模式,可用来实现静态多态,参考https://blog.csdn.net/m0_52329237/article/details/116505275
注意
执行此操作时,请记住调用 share _from _this 的对象必须属于 share_ptr 对象。以下行不通:
int main()
{S *p = new S;shared_ptr<S> sp2 = p->not_dangerous(); // don't do this
}