http://blog.csdn.net/lmsnju/article/details/4734840
#include <iostream>
#include <stdexcept>
using namespace std;
template<typename T>
class SmartPtr
{
public:
SmartPtr(T *p = 0):ptr(p),pUse(new size_t(1)){
}
SmartPtr(const SmartPtr &src):pUse(src.pUse),ptr(src.ptr)
{
++*pUse; //引用计数+1,拷贝的时候引用计数也要拷贝
}
SmartPtr& operator=(const SmartPtr &rhs) //复制
{
++ *rhs.pUse;//自己指向自己也算
decrUse();
ptr = rhs.ptr;
pUse = rhs.pUse; //注意这里是指针
return *this ;
}
T *operator->(){
if(ptr)
return ptr;
throw std::runtime_error("access NULL");
}
const T *operator->() const {
if (ptr)
return ptr;
throw std::runtime_error("access NULL");
}
T &operator*(){
if(ptr)
return *ptr;
throw std::runtime_error("derefferences of NULL");
}
const T &operator*() const{
if(ptr)
return *ptr;
throw std:: runtime_error("dereferece of NULL");
}
~SmartPtr(){
decUse();
}
private:
void decUse(){
if(--*pUse == 0)
{
delete ptr;
delete pUse;
}
}
T *ptr;
size_t *pUse;
};
class Data{
public:
Data(){
cout<<"init Data"<<endl;
}
~Data(){
cout<<"destroy Data"<<endl;
}
void print(){
cout<<"print Data"<<endl;
}
};
int main()
{
try{
SmartPtr<Data> t;
t->print();
}catch(const exception & err){
cout<<err.what()<<endl;
}
SmartPtr<Data> t(new Data);
return 0;
}