您的位置:首页 > 其它

智能指针的一个实现(没有考虑线程安全)

2014-09-03 01:11 363 查看
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: