您的位置:首页 > 其它

智能指针的实现

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