weak-ptr
怎么解决循环引用
循环引用导致ap和bp的引用计数都为2,在离开作用域之后,ap和bp的引用计数只减为1,而没有减为0,导致两个指针都不会被析构,产生内存泄漏。
std::shared_ptr<A> ap(new A);
std::shared_ptr<B> bp(new B);
weak_ptr的实现原理主要涉及到两个类:weak_ptr和shared_ptr。
在shared_ptr的控制块中,会有一个弱引用计数器weak_count,用于记录有多少个weak_ptr指向同一个资源。
当一个weak_ptr指向一个shared_ptr所管理的资源时,weak_count加1。
当我们需要使用weak_ptr时,可以通过
shared_ptr的成员函数lock()来得到一个指向资源的shared_ptr。
如果资源已经被释放,lock()会返回一个空的shared_ptr。
这样我们就可以通过检查返回的shared_ptr是否为空,来判断资源是否存在。
当weak_count为0时,说明没有任何weak_ptr指向该资源,资源可以被释放。