青岛开发区建网站哪家好,代理ip平台,常见的三种网站类型,小程序开发文档官网转自#xff1a;http://blog.csdn.net/malong777/article/details/48974559 weak_ptr是一种不控制对象生存周期的智能指针#xff0c;它指向一个shared_ptr管理的对象...它不会改变shared_ptr的引用计数——《C Primer .5th》。很明显#xff0c;weak_ptr的特点是“弱引用”…转自http://blog.csdn.net/malong777/article/details/48974559 weak_ptr是一种不控制对象生存周期的智能指针它指向一个shared_ptr管理的对象...它不会改变shared_ptr的引用计数——《C Primer .5th》。很明显weak_ptr的特点是“弱引用”。有什么用应用场景是什么地方 考虑它的胞兄shared_ptr每次复制之后引用计数加一不再指向对象自身销毁或指向其他对象时时引用计数减一减至零值调用所管理资源对象的析构函数。考虑这样一个情况两个对象各自包含指向彼此的shared_ptr成员形成环状引用引用计数永远为1不能销毁造成内存泄漏。 //x86_64 win7_64 vs2013 ultimate
#include iostream
#include string
#include memory
using namespace std; class A;
class B; class A{
public: ~A(){ cout destroying A\n ; } shared_ptrB pb;
}; class B{
public: ~B(){ cout destroying B\n ; } shared_ptrA pa;
}; void test(){ shared_ptrA a(new A()); shared_ptrB b(new B()); a-pb b; b-pa a;
} int main(){ cout begin test...\n; test(); cout end test\n;
} output:
begin test...
end test
请按任意键继续. . . 在函数test()中便是刚才提到的情形A、B的对象分别被彼此的shared_ptr所引用离开test作用域后A、B对象再也不能被用户访问因为智能指针a、b被销毁了但是各自引用计数为1两个对象的内存再也不会被释放可怕的内存泄漏就此产生。 那么weak_ptr对此又有帮助呢考虑如果将B中的智能指针换成weak_ptrA回过头看test里发生了什么首先shared_ptr版本的a、b初始化引用计数各自为1然后将b赋值给A中的shared_ptrB对象引用计数变为2将a赋值给B中的weak_ptr此操作不改变shared_ptrA的引用计数依旧为1。退出test作用域a、b析构B引用计数变为1A的引用计数为0。A的析构函数被调用A中的shared_ptrB也被销毁即B的引用计数再次减1变为0调用B的析构函数。此时内存已经被全部回收。 1 class B{ 2 public: 3 ~B(){ cout destroying B\n endl; } 4 weak_ptrA pa; 5 }; 6 output: 7 begin test... 8 destroying A 9
10 destroying B
11
12 end test
13 请按任意键继续. 实际用用的例子想象在一个tree结构中父节点通过一个共享所有权的引用(chared_ptr)引用子节点同时子节点又必须持有父节点的引用。如果这第二个引用也共享所有权就会导致一个循环最终两个节点内存都无法释放。转载于:https://www.cnblogs.com/13224ACMer/p/6404068.html