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