博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[C++11]shared_ptr循环引用导致内存泄露
阅读量:5170 次
发布时间:2019-06-13

本文共 773 字,大约阅读时间需要 2 分钟。

1 /* 2  *    shared_ptr循环引用导致内存泄露 3  */ 4  5 struct A 6 { 7     shared_ptr ptr; // 改为weak_ptr ptr就可以解决问题 8     int val; 9     A(int inVal):val(inVal){} 10 ~A() 11  { 12 cout << "Destructor: value " << val << endl; 13  } 14 }; 15 16 int main() 17 { 18 shared_ptr ptr1(new A(1)); // strong ref 是1 19 ptr1->ptr = ptr1; // strong ref 是2 20 cout << ptr1.use_count() << endl; 21 22 return 0; 23 /* 24 * ptr1释放,ref count减1,但此时仍为1,因此未能进行内存释放,导致泄露 25 */ 26 }

要解决此问题,需要使用weak_ptr来进行修改,因为weak_ptr允许你“共享但不拥有”某对象,strong ref则始终为1,在释放了栈空间上的ptr1内存时,ref count减1为0,则进行相应的对象的内存释放(调用A的析构函数),weak ref在最后又变为0(当shared_ptr失去了拥有权以后)。

一旦最末一个拥有该对象的shared pointer失去了拥有权,任何weak pointer都会自动成空。因此在default和copy构造函数之外,class weak_ptr只提供接受一个shared_ptr的构造函数。

 

转载于:https://www.cnblogs.com/brianyi/p/8662540.html

你可能感兴趣的文章
LintCode-Backpack
查看>>
查询数据库锁
查看>>
面试时被问到的问题
查看>>
注解小结
查看>>
201421410014蒋佳奇
查看>>
Xcode5和ObjC新特性
查看>>
CSS属性值currentColor
查看>>
Real-Time Rendering 笔记
查看>>
多路复用
查看>>
【UVA】434-Matty&#39;s Blocks
查看>>
hadoop2.2.0+hive-0.10.0完全分布式安装方法
查看>>
使用Reporting Services时遇到的小问题
查看>>
约瑟夫问题
查看>>
Arduino 报错总结
查看>>
树莓派Android Things物联网开发:树莓派GPIO引脚图
查看>>
矩阵快速幂---BestCoder Round#8 1002
查看>>
Hadoop HBase概念学习系列之HBase里的宽表设计概念(表设计)(二十七)
查看>>
awk变量
查看>>
mysql_对于DQL 的简单举例
查看>>
35. Search Insert Position(C++)
查看>>