//main.cpp
#include <iostream>
#include "class.h"
using namespace std;
int main(int argc, char** argv) {//使用智能指针,无需再考虑释放的问题
SmartPtr<int> ptr1(new int(2));
SmartPtr<int> ptr2(ptr1);
SmartPtr<int> ptr3 = ptr2;
cout << *ptr1 << endl;
*ptr1 = 20;
cout << *ptr2 << endl;
cout << *ptr3 << endl;
return 0;
}
//class.h
#ifndef class_h
#define class_h
#include <iostream>
using namespace std;
template <typename T>
class SmartPtr;//声明“智能指针”模板类
template <typename T>//使用模板,允许指针指向任何类型
class U_Ptr{//辅助指针,用于对引用次数进行计数
private:
friend class SmartPtr<T>;
U_Ptr(T *ptr):p(ptr),count(1){}//初始计数为1
~U_Ptr(){delete p;}
int count;
T *p;
};
template <typename T>//使用模板,允许指针指向任何类型
class SmartPtr{//“智能指针”
private:
U_Ptr<T> *rp;
public:
SmartPtr(T *ptr):rp(new U_Ptr<T>(ptr)){}
SmartPtr(const SmartPtr<T> &sp):rp(sp.rp){//先复制
++rp->count;//拷贝构造函数,引用计数加一
}
SmartPtr& operator=(const SmartPtr<T>& rhs){
++rhs.rp->count;//将rhs的引用计数加一
if(--rp->count == 0)//原来指向对象的引用计数减一
delete rp;//如果引用计数为0则释放基础对象
rp = rhs.rp;//执行实际的赋值动作
return *this;
}
~SmartPtr(){
if(--rp->count == 0)//析构函数,引用计数减一
delete rp;//如果引用计数为0则释放基础对象
}
//操作符*和->的重载,实现和指针一样功能的操作符
T& operator*(){return *(rp->p);}
T* operator->(){return rp->p;}
};
#endif
疑问:如何销毁智能指针所指的对象,验证引用计数等于0的情况?delete ptr2和delete *ptr2都已经无效了。该怎么办?