enable_shared_from_this

用途

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.youkuaiyun.com/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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值