C++ 智能指針 循環引用以及解決方案

今天面試碰到這個問題了,結果自己沒有搞清楚是個是麼問題。感覺面試官說的也不太清楚。。我理解成兩個兩個智能指針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;
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章