实现的一个和系统的shared_ptr保持大概一致的智能指针,能够大概一窥智能指针的原理
/**
* 自己实现一个简单的智能指针类来理解原理
* */
#include<iostream>
#include<memory>
using namespace std;
template<typename T>
class mptr{
T* ptr;
int *count; //引用计数,用来判断对象是否应该析构
public:
mptr(T* p){ //初始化
ptr=p;
count=new int(1);
}
mptr(const mptr& obj){//拷贝构造,引用计数+1
ptr=obj.ptr;
count=obj.count;
(*count)++;
}
mptr<T>& operator=(const mptr<T>& obj){
//赋值或者复制的时候,引用计数+1,析构的时候判断是否为0,0就释放空间
ptr=obj.p;
count=obj.count;
(*count)++;
return *this;
}
~mptr(){
(*count)--;
if((*count)==0){
delete ptr; //引用计数为0的时候,释放内存
delete count;
}
}
int use_count(){
return (*count);
}
};
class a{
public:
a(){
cout<<"construct"<<endl;
}
~a(){
cout<<"del"<<endl;
}
};
int main(){
//shared_ptr<a> ptra=make_shared<a>(); //系统自带的shared_ptr
mptr<a> ptra(new a);
cout<<"ptra end"<<ptra.use_count()<<endl;
//shared_ptr<a> ptrb=ptra; //系统自带的shared_ptr
mptr<a> ptrb=ptra; //自己的这个模拟类能够保持和系统的shared_ptr有一样的效果
cout<<"end "<<ptra.use_count()<<" "<<ptrb.use_count()<<endl;
return 0;
}