[C++11]shared_ptr循环引用导致内存泄露

 1 /*
 2  *    shared_ptr循环引用导致内存泄露
 3  */
 4 
 5 struct A
 6 {
 7     shared_ptr<A> ptr; // 改为weak_ptr<A> 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<A> 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的构造函数。

 

posted @ 2018-03-28 10:58  byjz  阅读(460)  评论(0编辑  收藏  举报