【转】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。