zoukankan      html  css  js  c++  java
  • [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的构造函数。

  • 相关阅读:
    C++类中的函数重载
    C++中的友元
    bzoj 2820
    莫比乌斯函数
    bzoj 2440: [中山市选2011]完全平方数
    莫比乌斯反演1
    [转]C++ 指针和引用
    P2756 飞行员配对方案问题
    P2055 [ZJOI2009]假期的宿舍
    P2654 原核生物培养
  • 原文地址:https://www.cnblogs.com/brianyi/p/8662540.html
Copyright © 2011-2022 走看看