Weak_ptr實現

前言:

循環引用實例:

/*
    @author:wcx
    @task:shared_ptr循環引用實例
*/
#include<bits/stdc++.h>
using namespace std;
struct node{
    shared_ptr<node> t;
};
int main(){
    shared_ptr<node> a(new node);
    shared_ptr<node> b(new node);
    a->t=b;
    b->t=a;
}

當a刪除的時候,因爲自身引用計數爲2(b指向了自己),所有減爲1不會釋放內部成員,也就是指向的b引用計數不會變化,釋放b的時候也一樣,所以到最後兩者都不會釋放,計數爲1。

解決方法:

用weak_ptr解決,它是輔助shared_ptr的一個結構,不增加引用計數,準確意義來說它不是個指針,它不能隨意指向。

/*
    @author:wcx
    @task:shared_ptr循環引用解決
*/
#include<bits/stdc++.h>
using namespace std;
struct node{
    weak_ptr<node> t;
};
int main(){
    shared_ptr<node> a(new node);
    shared_ptr<node> b(new node);
    a->t=b;
    b->t=a;
}

Weak_ptr實現:

/*
    @author:wcx
    @task:weak_ptr實現
*/
#include<bits/stdc++.h>
using namespace std;
namespace P{
    template <typename T>
    class Weak_ptr{
        //不佔用引用計數
    public:
        Weak_ptr(const shared_ptr<T> da):s(da.ptr){}
        ~Weak_ptr(){}
    protected:
        T *s;
    };
}
int main(){
    using namespace P;
    Shared_ptr<int> a(new int);
    Weak_ptr<int> t(a);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章