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 pB) {
12         p = pB;
13     }
14 
15 private:
16     shared_ptr 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 pA) {
30         p = pA;
31     }
32 
33 private:
34     shared_ptr p;
35 };

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

1 shared_ptr pA = make_shared();
2 shared_ptr pB = make_shared();
3 
4 pA->setInnerPtr(pB);
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 pB) {
12         p = pB;
13     }
14 
15 private:
16     weak_ptr 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 pA) {
30         p = pA;
31     }
32 
33 private:
34     weak_ptr p;
35 };

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

shared_ptr

 

你可能感兴趣的:(shared_ptr引起内存泄露以及解决办法)