问题:Rc<T>会引起循环引用
解决:使用弱引用
定义:Weak<T>
- 弱引用通过Rc::downgrade 传递Rc实例的引用,调用Rc::downgrade会得到Weak<T>类型的智能指针,同时将weak_count加1(不是将strong_count加1)。
- 区别在于weak_count 无需计数为0 就能使Rc实例被清理。只要strong_count为0就可以了。
- 可以通过Rc::upgrade方法返回Option<Rc<T>>对象。
C++中:
![](https://img.haomeiwen.com/i13996213/4a9e5da93af331ed.jpeg)
weak_ptr的岗位职责用一句话来描述就是:看managed object是否还存在,如果存在,可以提供负责管理该managed object的shared_ptr。
std::weak_ptr 是一个不控制资源生命周期的智能指针,是对对象的一种弱引用,只是提供了对其管理的资源的一个访问手段,引入它的目的为协助 std::shared_ptr 工作。
std::weak_ptr 可以从一个 std::shared_ptr 或另一个 std::weak_ptr 对象构造,std::shared_ptr 可以直接赋值给 std::weak_ptr ,也可以通过 std::weak_ptr 的 lock() 函数来获得 std::shared_ptr。它的构造和析构不会引起引用计数的增加或减少。std::weak_ptr 可用来解决 std::shared_ptr 相互引用时的死锁问题(即两个std::shared_ptr 相互引用,那么这两个指针的引用计数永远不可能下降为 0, 资源永远不会释放)。
网友评论