weak_ptr不能直接用来定义一个智能指针的对象,只能配合shared_ptr来使用,解决shared_ptr循环引用的问题。

循环引用

share_ptr, weak_ptr
如图所示,即使对象ptr_a和ptr_b被销毁,也就是①③两条引用会被断开,但是②④两条引用依然存在,每一个的引用计数都不为0,结果就导致其指向的内部对象无法析构,造成内存泄漏。

解决这种状况的办法就是将两个类中的一个成员变量改为weak_ptr对象,因为weak_ptr不会增加引用计数,使得引用不形成环,最后就可以正常的释放内部的对象。
share_ptr, weak_ptr
对象ptr_a和ptr_b被销毁,也就是①③两条引用会被断开,此时CA对象的引用计数会减为0,对象被销毁,其内部的m_ptr_b成员变量也会被析构,导致CB对象的引用计数会减为0,对象被销毁,进而解决了引用成环的问题。

weak_ptr常用函数

weak_ptr中只有函数lock和expired两个函数比较重要,因为它本身不会增加引用计数,所以它指向的对象可能在它用的时候已经被释放了,所以在用之前需要使用expired函数来检测是否过期,然后使用lock函数来获取其对应的shared_ptr对象,然后进行后续操作。

相关文章:

  • 2021-08-23
  • 2021-06-12
  • 2021-10-26
  • 2021-08-15
  • 2022-12-23
  • 2021-08-05
  • 2021-10-14
猜你喜欢
  • 2022-12-23
  • 2021-08-07
  • 2022-12-23
  • 2021-07-15
  • 2022-01-05
  • 2022-12-23
  • 2021-09-28
相关资源
相似解决方案