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

原文地址:https://www.cnblogs.com/hzcya1995/p/13309076.html