【转】C++ 11 智能指针之week_ptr
week_ptr是对对象的一种弱引用,它不会增加对象的引用计数。week_ptr和shared_ptr之间可以相互转换,shared_ptr可以直接赋值给week_ptr,week_ptr可通过调用lock函数来获得shared_ptr(如果对象已经被释放,则返回一个空的shared_ptr)。
单纯使用shared_ptr有时会产生问题,考虑下面的代码:
1 class A; 2 class B; 3 typedef shared_ptr<A> A_Share; 4 typedef shared_ptr<B> B_Share; 5 class A 6 { 7 public: 8 B_Share m_b; 9 }; 10 11 class B 12 { 13 public: 14 A_Share m_a; 15 }; 16 17 A_Share a(new A()); 18 B_Share b(new B()); 19 a.m_b = b; 20 b.m_a = a;
在上面的代码中,a和b相互进行引用。在a和b离开作用域时,a和b的引用计数都是1,内存没有正常释放。解决方法是将A和B中的任意一个类声明的变量改为week_ptr类型的。比如,修改类B后的代码如下:
1 class B 2 { 3 public: 4 week_ptr<A> m_a; 5 }
修改后,b.m_a = a不会增加A对象的引用计数,因此a离开作用域时,引用计数为0。B对象的引用计数为2,在a和b离开作用域时,引用计数各减1后也为0。