c++智能指针(五)之weak_ptr

weak_ptr

weak_ptr是一种不控制所指向对象的生存期的智能指针,它指向由一个shared_ptr所管理的对象。将一个weak_ptr绑定到shared_ptr上面不会改变shared_ptr的引用计数。
一旦最后一个指向对象的shared_ptr被销毁,对象就会被释放。

创建

auto p = make_shared<int>(42);
weak_ptr<int>q(p);//q弱共享p,p的引用计数不会改变

访问

由于对象可能不存在,我们不能使用weak_ptr直接访问对象,而必须调用lock。

    if (shared_ptr<int> np = q.lock()){//如果np不为空则条件成立
        //在if中,np与p共享对象
    }

weak_ptr与循环引用

struct A
{
  std::shared_ptr<A> ptr;
};

void main()
{
  std::shared_ptr<A> x=std::make_shared<A>();
  std::shared_ptr<A> y=std::make_shared<A>();

  x->ptr = y; // 这还不算是循环引用
  y->ptr = x; // 现在算是循环引用了, x使y保持存活y使x保持存活。他们两个的计数至少为1,永远不会变成0。
}

这个时候,只需要把其中一个shared_ptr改成weak_ptr就可以解决这个问题了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值