文章目录
概述
shared_ptr的作用主要是在最后一个指向资源的shared_ptr销毁时自动释放资源,然而在某些场景下这种行为可能不被期望。例如:
- 两个或者多个对象都使用shared_ptr,并且相互通过shared_ptr指向对方,如果存在一个环路(cyclic reference),那么由于环路上的shared_ptr的use_count最终无法降为0,所以环路上的资源将无法被释放。
- 当我们想使用“希望共享但不拥有”某个对象的语义的情况下,shared_ptr也无法提供此语义。
因此weak_ptr可以在这两种场景下使用。
构建
weak_ptr可以通过shared_ptr构建以及赋值
shared_ptr<ClassA> spA(new ClassA);
weak_ptr<ClassA> wpA1(spA);
weak_ptr<ClassA> wpA2 = spA;
expired函数
weak_ptr并不增加shared_ptr的引用计数,因此有可能发生对象已经析构但是weak_ptr还在的情况,此时使用weak_ptr就必须小心,当对象即将发生析构或者已经析构,expired返回true,expired函数效率比use_count高,该函数返回true时其结果才有意义,因为返回false时,此时执行下一个语句,对象有可能在其他线程同时被释放。
获取指针
使用weak_ptr时访问对象的方式有所变化:
Alice->m_otherOne->m_name; // shared_ptr访问对象方式
Alice->m_otherOne.lock()->m_name; // weak_ptr访问对象方式
lock函数返回一个从weak_ptr构建的临时的shared_ptr,通过此shared_ptr我们可以访问对