//#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;
//}
智能指针的实现
最新推荐文章于 2024-08-31 17:59:00 发布