智能指针
智能指针是一个模板类,封装了普通指针。通过在构造函数中初始化分配内存,在析构函数中释放内存,达到自己管理内存,不需要手动管理内存的效果。
shared_ptr:通过引用计数来实现对象是否被释放。当引用计数为0时,表示没有指针指向这块内存,析构函数可以去释放这块内存了。
自己实现:
//引用计数类
class Counter{
public:
int s; //shared_ptr引用计数
int w; //weak_ptr引用计数
Counter():s(0),w(0){}
};
template<class T>
class Shared_ptr{
private:
T* _ptr;
Counter* cnt;
public:
//以普通指针进行构造
Shared_ptr(T* ptr=nullptr){
_ptr=ptr;
cnt=new Counter();
if(ptr) cnt->s++;
}
//拷贝构造函数
Shared_ptr(const Shared_ptr<T> &s){
_ptr=s._ptr;
(s.cnt)->s++;
cnt=s.cnt;
}
//析构函数
~Shared_ptr(){
release();
}
//等号赋值操作符
Shared_ptr<T> operator=(Shared_ptr<T> &s){
if(this!=&s){
realese();
_ptr=s._ptr;
(s.cnt)->s++;
cnt=s.cnt;
}
return *this;
}
T& operator*(){ return *_ptr; }
T* operator->(){ return _ptr; }
protected:
void release(){
cnt->s--; //这一步别忘了
if(cnt->s<1){
delete _ptr;
if(cnt->w<1)
{
delete cnt;
cnt=nullptr; //这一步别忘了
}
}
}
};