1 class A; 2 class B; 3 typedef shared_ptr A_Share; 4 typedef shared_ptr 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 weak_ptr m_a; 5 }修改后,b.m_a = a不会增加A对象的引用计数,因此a离开作用域时,引用计数为0。B对象的引用计数为2,在a和b离开作用域时,引用计数各减1后也为0。