智能指针的一个实现(没有考虑线程安全)
2014-09-03 01:11
405 查看
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; }
相关文章推荐
- 实现一个简单的智能指针
- 自己动手实现一个C++智能指针
- 一个智能指针的简单实现
- 一个智能指针模板的实现及应用
- 一个可以放入STL容器的简洁、高效、非计数的智能指针实现
- 一个智能指针的实现
- 一个简单的智能指针的实现
- 一个智能指针模板的实现及应用
- 一个简单的智能指针实现
- 请简述智能指针原理,并实现一个简单的智能指针。
- 一个C++智能指针的实现
- C++ 智能指针的一个实现(基于模板和Shared_ptr)
- 一个简单的智能指针实现
- 自己实现一个C++ 智能指针
- 一个简单的智能指针的实现
- 智能指针原理,并实现一个简单的智能指针
- 自己实现一个带引用计数的智能指针,根据源码
- 一个智能指针的实现(改进)
- 实现一个简洁版的智能指针
- 一个简单的C++智能指针的实现