zoukankan      html  css  js  c++  java
  • SHARED_PTR引起内存泄露以及解决办法

    shared_ptr如果使用不当的话,会引起内存泄漏。例如,对于如下定义的ClassA和ClassB

    复制代码

     1 class ClassA {
     2 public:
     3     ClassA() {
     4         std::cout << "ClassA()" << std::endl;
     5     }
     6 
     7     ~ClassA() {
     8         std::cout << "~ClassA()" << std::endl;
     9     }
    10 
    11     void setInnerPtr(shared_ptr<ClassB> pB) {
    12         p = pB;
    13     }
    14 
    15 private:
    16     shared_ptr<ClassB> p;
    17 };
    18 
    19 class ClassB {
    20 public:
    21     ClassB() {
    22         std::cout << "ClassB()" << std::endl;
    23     }
    24 
    25     ~ClassB() {
    26         std::cout << "~ClassB()" << std::endl;
    27     }
    28 
    29     void setInnerPtr(shared_ptr<ClassA> pA) {
    30         p = pA;
    31     }
    32 
    33 private:
    34     shared_ptr<ClassA> p;
    35 };

    复制代码

    如果按照如下的方式使用这两个类的话

    1 shared_ptr<ClassA> pA = make_shared<ClassA>();
    2 shared_ptr<ClassB> pB = make_shared<ClassB>();
    3 
    4 pA->setInnerPtr(pBnqz5JNTg);
    5 pB->setInnerPtr(pA);

    那么,在离开作用域后,pA和pB的引用计数都是1,彼此都在等待对方释放。

    这个问题可以用weak_ptr解决:把ClassA和ClassB中的shared_ptr改为weak_ptr即可:

    复制代码

     1 class ClassA {
     2 public:
     3     ClassA() {
     4         std::cout << "ClassA()" << std::endl;
     5     }
     6 
     7     ~ClassA() {
     8         std::cout << "~ClassA()" << std::endl;
     9     }
    10 
    11     void setInnerPtr(shared_ptr<ClassB> pB) {
    12         p = pB;
    13     }
    14 
    15 private:
    16     weak_ptr<ClassB> p;
    17 };
    18 
    19 class ClassB {
    20 public:
    21     ClassB() {
    22         std::cout << "ClassB()" << std::endl;
    23     }
    24 
    25     ~ClassB() {
    26         std::cout << "~ClassB()" << std::endl5z5kKiDGm;
    27     }
    28 
    29     void setInnerPtr(shared_ptr<ClassA> pA) {
    30         p = pA;
    31     }
    32 
    33 private:
    34     weak_ptr<ClassA> p;
    35 };

    复制代码

    由于给weak_ptr赋值不会增加引用计数,所以,在离开作用域后,pA和pB的引用计数都是0,从而被自动释放。

    shared_ptr

  • 相关阅读:
    CSPS模拟 65
    CSPS模拟 64
    $color$有色图
    CSPS模拟 63
    CSPS模拟 62
    CSPS模拟 61
    CSPS模拟 60
    CSPS模拟 59
    go中单链表
    MYSQL-联合索引
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13309076.html
Copyright © 2011-2022 走看看