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的构造函数。