weak_ptr智能指针

为什么需要weak_ptr?

因为虽然我们可以使用shared_ptr指针,但是不得不说使用shared_ptr还有一些不美好的地方需要注意和解决,所以我们的weak_ptr也是为了帮助解决这些问题而设计出来的。

问题如下:

  1. 环向指向:两个共享指针之间互相指向,所以就永远也不会出现计数器减为0的情况出现所以,就不会释放资源。
  2. 想共享但是不愿意拥有:比如说引用的寿命其实比引用的对象存活时间长,所以shared_ptr也不可能释放对象,一般的指针判断不出来它们指向的对象已经失效

weak_ptr指针的特点

允许共享但是不拥有对象, 这个class会建立起一个shared pointer,一旦最末的一个该对象的shared pointer失去了所有权,所有的weak ptr都会自动成空,因而,在default和copy函数以外class weak_ptr只提供“接受一个shared_ptr”的构造函数。

不能使用*或者->来访问weak_ptr里面的所指向的对象,而是必须建立起另外一个shared pointer,这样设计的原因:

  1. 在weak_ptr之外建立一个shared_ptr这样可以检验weak_ptr里面存的指针还有没有效,如果没有就会抛出异常或者建立一个empty shared pointer
  2. 当指向的对象正在被处理的时候,shared pointer无法被释放
  3. weak只是提供小批量操作,只够创建、复制、赋值weak ptr以及转换为shared pointer

使用的一个例子

class Person{
public:
    string name;
    shared_ptr<Person> mom;
    shared_ptr<Person> dad;
    vector<shared_ptr<Person> > kids;
    Person(string myName,
           shared_ptr<Person> &mother,
           shared_ptr<Person> &father):
           name(myName),mom(mother),dad(father){}
};

仔细观察上面的这个Person类,里面不仅有两个父亲母亲的shared_ptr同时每个父母都要记录自己的孩子,放在vector里面保存一份,最后就是一个循环,一个Person希望释放自己的shared_ptr但是,在它的父母类里面保存了一份在vector里面,如果要释放父母的话,也不允许,因为保存了一份在子类里面。所以修改方式就是将vector元素类型改成weak_ptr就可以解决这个问题。

想要确定weak_ptr背后的对象是否存活?

  1. 调用expired(),它会在weak_ptr不在共享对象时返回true,这等同于检查use_count()是否为0,但速度较快
  2. 可以使用相应的shared_ptr构造函数明确将weak_ptr转换为一个shared_ptr,如果被指对象已经不存在,该构造函数会抛出一个bad_weak_ptr异常。
  3. 调用use_count()则会询问使用的对象的数量,如果返回0表示不存在任何有效的对象,通常只应为调试而使用,use_count效率不总是很高 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值