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

上一篇:static关键字所导致的内存泄漏问题


下一篇:python中循环引用导致内存泄漏小案例