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