前言:
循環引用實例:
/*
@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;
}