C++ share_ptr 循环引用问题浅析
share_ptr指针涉及到循环引用问题会因为share_ptr指针对应的use_count()无法清0,导致内存泄露,直接上例子:
1 class S_B; 2 class S_A 3 { 4 public: 5 shared_ptr<S_B> m_b; 6 }; 7 8 class B 9 { 10 public: 11 shared_ptr<S_A> m_a; 12 }; 13 14 int main() 15 { 16 while (true) 17 { 18 shared_ptr<S_A> S_a(new S_A); //S_A.use_count()=1 19 shared_ptr<S_B> S_b(new S_B); //S_B.use_count()=1 20 S_a->m_b = S_b; //S_B.use_count()++ 21 S_b->m_a = S_a; //S_A.use_count()++ 22 } 23 24 //S_b先出作用域,S_B.use_count()--,此时S_B.use_count()=1,所以堆上的S_B空间没有被释放,由于S_B没有被释放,故不会调用析构函数释放内部的S_a,S_A.use_count()=2. 25 26 //S_a后出作用域,S_A.use_count()--,此时S_A.use_count()=1,所以堆上S_A的空间也没有被释放,S_A内部的S_b的引用依然没被释放 27 28 }