今天面試碰到這個問題了,結果自己沒有搞清楚是個是麼問題。感覺面試官說的也不太清楚。。我理解成兩個兩個智能指針A = B B = A,A = B,這種了。。。我還說這種不會引計數器多++。。尷尬。。自己基礎方面還是有點問題。。
循環引用如下
#include<bits/stdc++.h>
using namespace std;
class B;
class A{
public:
shared_ptr<B> ptr_b;
};
class B{
public:
shared_ptr<A> ptr_a;
};
weak_ptr<A> show(){
shared_ptr<A> ptr_A = make_shared<A>();
shared_ptr<B> ptr_B = make_shared<B>();
ptr_A->ptr_b = ptr_B;
ptr_B->ptr_a = ptr_A;
return ptr_A;
}
int main(void){
weak_ptr<A> weak = show();
shared_ptr<A> ptr = weak.lock();
cout << ptr.use_count() << endl;
return 0;
}
這裏最後輸出結果是2.所以很現實發生了內存泄露。導致這個的原因很容易分析,當ptr_A釋放的時候,A指針的計數器變爲1.但指向的那塊內存並沒有釋放,所以B指針的計數器依然爲2,這時ptr_B釋放的時候,B指針的計數器變爲1,。所以兩塊內存都沒有被釋放。
下面這種情況也會引發這個問題。
#include<bits/stdc++.h>
using namespace std;
class C{
public:
shared_ptr<C> ptr_c;
};
weak_ptr<C> show(){
shared_ptr<C> ptr = make_shared<C>();
ptr->ptr_c = ptr;
return ptr;
}
int main(void){
weak_ptr<C> weak = show();
shared_ptr<C> ptr = weak.lock();
cout << ptr.use_count() << endl;
return 0;
}
輸出也是2.主要就是計數器不變爲0,智能指針不會銷燬這塊內存。
解決方案就是使用弱智能指針了。這種指針不會增加智能指針的計數,而且也可以獲得對象。
class B;
class A{
public:
weak_ptr<B> weak_b;
};
class B{
public:
weak_ptr<A> weak_a;
};