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