智能指针的实现
2016-11-20 17:29
183 查看
//#include<iostream> //using namespace std; //模拟auto_ptr(不要使用) /*AutoPtr只是实现了构造函数和析构函数,对于拷贝构造函数和赋值运算符重载是系统默认的, 系统默认情况下是值拷贝,存在一块空间被释放两次及以上的情况,导致程序运行错误。*/ //template<typename T> //class Auto_ptr //{ //public: // Auto_ptr( T* p) // :_p(p) // { // } // ~Auto_ptr() // { // if(_p!=NULL) // { // delete _p; // _p=NULL; // } // } //public: // T& operator *() // { // return *_p; // } // T& operator ->() // { // return _p; // } // //private: // T* _p; //}; //void FunTest() //{ // Auto_ptr<int>p1= new int; // Auto_ptr<int>p2(p1); // *p1=10; //} //int main() //{ // FunTest(); // getchar(); // return 0; //} //解决Auto_Ptr的方法,将第一个指向这块空间的指针直接置为空,然后进行析构。 //template<typename T> //class Auto_ptr //{ //public: // Auto_ptr( T* p) // :_p(p) // { // } // ~Auto_ptr() // { // if(_p!=NULL)//一定要判断是否为NULL; // { // delete _p; // _p=NULL; // } // } // Auto_ptr(Auto_ptr &p) // :_p(p._p) // { // p._p=NULL; // } // Auto_ptr& operator =(Auto_ptr& p) // { // if(this!=&p) // { // delete _p; // _p=p._p; // p._p=NULL; // } // return *this; // } //public: // T& operator *() // { // return *_p; // } // T& operator ->() // { // return _p; // } // //private: // T* _p; //}; //void FunTest() //{ // Auto_ptr<int>p1= new int; // *p1=10; // Auto_ptr<int>p2(p1); // cout<<*p2<<endl; //} //int main() //{ // FunTest(); // getchar(); // return 0; //} //模拟 ScopedPtr /*ScopedPtr就是只要防止创建的指针对象进行复制和拷贝构造; 我们只要在类里面将它的拷贝构造和赋值运算符给成protected就行,只给声明,不给定义, 当用户进行赋值和拷贝构造时候,编译阶段就会报错*/ //template<typename T> //class ScopedPtr //{ //public: // ScopedPtr( T* p) // :_p(p) // { // } // ~ScopedPtr() // { // if(_p!=NULL) // { // delete _p; // _p=NULL; // } // } //public: // T& operator *() // { // return *_p; // } // T& operator ->() // { // return _p; // } //protected: // //防止拷贝 // ScopedPtr(ScopedPtr&); // ScopedPtr& operator =(ScopedPtr&); //private: // T* _p; //}; //void FunTest() //{ // ScopedPtr<int>p1=new int; // *p1=10; //} //int main() //{ // FunTest(); // getchar(); // return 0; //} // 模拟ScopedArray //template<typename T> //class ScopedArray //{ //public: // ScopedArray( T*p=NULL ) // :_p(p) // { // } // ~ScopedArray() // { // if(_p!=NULL) // { // delete[] _p; // _p=NULL; // } // } //public: // T& operator *() // { // return *_p; // } // T& operator ->() // { // return _p; // } // T& operator [](size_t index) // { // assert(index>0); // return _p[index]; // } // const T& operator [](size_t index)const // { // assert(index>0); // return _p[index]; // } // //protected: // //防止拷贝 // ScopedArray(ScopedArray&); // ScopedArray& operator =(ScopedArray&); //private: // T* _p; //}; //void FunTest() //{ // ScopedArray<int>p1=new int[100]; // int a[10]={1,23,4,5,6,7,8,9,7,9}; // *p1=a[0]; //} //int main() //{ // FunTest(); // getchar(); // return 0; //} //模拟实现 SharedPtr /*SharedPtr指针主要的原理是利用引用计数的浅拷贝来实现,通过多开辟4个字节的方式,存储引用计数,当有指针指向这块空间时,引用计数+1。如若析构时, 先将这块空间的引用计数降为1,然后在进行析构,避免了析构多次的问题*/ //template<typename T> //class SharedPtr //{ //public: // SharedPtr( T* p=NULL) // :_p(p) // ,_pcount(new int(1)) // {} // SharedPtr(SharedPtr&p) // :_p(p._p) // ,_pcount(p._pcount ) // { // ++(*_pcount); // } // SharedPtr&operator =(SharedPtr &p) // { // if(NULL==_p)//自己管理一块空间 // { // _p=p._p; // _pcount=p._pcount; // ++(*_pcount); // } // if(1==*_pcount&&_p!=p._p)//自己独占一块空间 // { // delete _p; // delete _pcount; // _p=p._p; // _pcount=p._pcount; // ++(*_pcount); // } // if((*_pcount)>1)//和别人共用一块空间 // { // --(*_pcount); // _p=p._p; // _pcount=p._pcount; // ++(*_pcount); // } // return *this; // } // ~SharedPtr() // { // (*_pcount)--; // if((*_pcount)==0) // { // delete _p; // delete _pcount; // _p=NULL; // _pcount=NULL; // } // } //public: // T& operator *() // { // return *_p; // } // T& operator ->() // { // return _p; // } // int *_pcount; //private: // T* _p; // //}; //void FunTest() //{ // SharedPtr<int>p1= new int; // SharedPtr<int>p2(p1); // SharedPtr<int>p3=new int; // p2=p3; // SharedPtr<int>p4=new int; // p2=p4; // cout<<*(p1._pcount)<<endl; // cout<<*(p2._pcount)<<endl; // cout<<*(p3._pcount)<<endl; // /*cout<<*(p4._pcount)<<endl;*/ // //} //int main() //{ // FunTest(); // getchar(); // return 0; //}
相关文章推荐
- 线性表(智能指针实现)
- 一个智能指针的实现(代码)
- c++中的智能指针实现
- 别人写的一个智能指针的实现,不知道能不能行
- 有效的使用和设计COM智能指针——条款3:按照功能和实现原理选择合适的智能指针
- 第十三章——复制控制 智能指针的code实现
- Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析(3)
- 一个简单的智能指针实现
- 智能指针实现程序示例
- Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析(2)
- (原创)Delphi2009初体验 - 语言篇 - 智能指针(Smart Pointer)的实现
- 一个智能指针模板的实现及应用
- 一个智能指针模板的实现及应用
- 实现一个简单的智能指针
- 智能指针的类实现
- 一个智能指针的实现(改进)
- Delphi中实现智能指针
- C++标准库中简单智能指针auto_ptr的模仿实现源码
- 智能指针 安全引用的实现
- Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析