经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C » 查看文章
c/c++ 智能指针 weak_ptr 使用
来源:cnblogs  作者:小石王  时间:2018/9/30 11:03:36  对本文有异议

智能指针 weak_ptr 使用

weak_ptr用途:

1,解决空悬指针问题

2,解决循环引用问题

weak_ptr特点:没有*操作和->操作


weak_ptr是不控制所指对象生存周期的智能指针,它指向由一个shared_ptr管理的对象。将一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的计数器。一旦最后一个指向对象的shared_ptr被销毁,对象就会被释放,即使有weak_ptr指向这个对象,对象也会被释放。

一,先来个表格,唠唠weak_ptr

操作 功能描述
weak_ptr<T> w 空weak_ptr,可以指向类型为T*的对象。
weak_ptr<T> w(sp) 与shared_sp sp指向相同对象的weak_ptr。T必须能转换为sp所指的类型。
w = p p可以是一个shared_ptr或一个weak_ptr。赋值后w指向p所指的对象。
w.reset() 将w置为空
w.use_count() 与w共享对象的shared_ptr的数量
w.expired() 若w.use_count()为0,返回true,否则返回false
w.lock() 如果expired()为true,返回一个空shared_ptr;否则返回一个指向w所指对象的shared_ptr。

小例子索引

代码块 功能描述
test1 weak_ptr不增加引用计数
test2 weak_ptr没有->和*操作
test3 lock使用
test4 循环引用,导致即使是智能指针也不能释放内存。用weak_ptr解决了循环引用,导致的内存不能释放的问题

小例子

  1. #include <iostream>
  2. #include <memory>
  3. #include <vector>
  4. using namespace std;
  5. class Test{
  6. public:
  7. Test(int d = 0) : data(d){cout << "new" << data << endl;}
  8. ~Test(){cout << "del" << data << endl;}
  9. void func(){cout << "func" << endl;}
  10. private:
  11. int data;
  12. };
  13. //test4 循环引用,导致即使是智能指针也不能释放内存
  14. class teacher;
  15. class student;
  16. class teacher{
  17. public:
  18. teacher(){cout << "teacher()" << endl;}
  19. ~teacher(){cout << "del teacher" << endl;}
  20. shared_ptr<student> stu;
  21. };
  22. class student{
  23. public:
  24. student(){cout << "student()" << endl;}
  25. ~student(){cout << "del student" << endl;}
  26. //如果换成shared_ptr<teacher> tea;就会形成循环引用,导致内存泄漏
  27. weak_ptr<teacher> tea;
  28. };
  29. int main(){
  30. //test1 weak_ptr不增加引用计数
  31. /*
  32. shared_ptr<Test> sp1 = make_shared<Test>(1);
  33. cout << sp1.use_count() << endl;//1
  34. weak_ptr<Test> wp1 = sp1;
  35. cout << wp1.use_count() << endl;//1
  36. */
  37. //test2 weak_ptr没有->和*操作
  38. //wp1->func();
  39. //(*wp1).func();
  40. //test3 lock使用
  41. /*
  42. shared_ptr<int> sptr;
  43. sptr.reset(new int);
  44. *sptr = 10;
  45. weak_ptr<int> weak1 = sptr;
  46. sptr.reset(new int);
  47. *sptr = 5;
  48. weak_ptr<int> weak2 = sptr;
  49. // weak1 is expired!
  50. if(auto tmp = weak1.lock())
  51. cout << *tmp << '\n';
  52. else
  53. cout << "weak1 is expired\n";
  54. // weak2 points to new data (5)
  55. if(auto tmp = weak2.lock())
  56. cout << *tmp << '\n';
  57. else
  58. cout << "weak2 is expired\n";
  59. */
  60. //test4 循环引用,导致即使是智能指针也不能释放内存
  61. //用weak_ptr解决了循环引用,导致的内存不能释放的问题
  62. shared_ptr<teacher> tptr(new teacher);//计数器1
  63. shared_ptr<student> sptr(new student);//计数器1
  64. tptr->stu = sptr;//sptr的计数器2
  65. sptr->tea = tptr;//不增加tptr的引用计数,因为tea是weak指针
  66. cout << tptr.use_count() << endl;//1
  67. cout << sptr.use_count() << endl;//2
  68. return 0;
  69. }

github完整代码

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号