语言基础(23):智能指针

智能指针的使用栗子(如下定义中,也可以将指针计数维护类增加封装为友元类,或者直接在智能指针类中维护):

	// CMySmartPtr指针封装类,将普通指针封装为智能指针
	template <class T>
	class CMySmartPtr  
	{
	public:
		/* 构造函数 */
		CMySmartPtr(T* pT)
		{
			pCountT = new CCountT(pT);
		}
		
		CMySmartPtr()
		{
			pCountT = NULL; // 默认指针为空
		}
	 
		/* 复制控制 */
		~CMySmartPtr()
		{
			DeleteData();
		}
	 
		CMySmartPtr(const CMySmartPtr& p)
		{
			CopyData(p);
		}
	 
		CMySmartPtr& operator=(const CMySmartPtr& p) 
		{
			if (this != &p)   // 注意自身对自身赋值的情况
			{
				DeleteData();
				CopyData(p);
			}
	 
			return *this;
		}
	 
		/* 指针*和->解引用 */
		T& operator*()
		{
			return *(this->pCountT->pT);
		}
	 
		T* operator->()
		{
			return this->pCountT->pT;
		}
	 
	private:
		// 装饰类,为智能指针维护引用计数、和所管理类型的指针
		class CCountT
		{
		public:
			CCountT(T* pT)
			{
				this->pT = pT;
				this->nCount = 1;
			}
			~CCountT()
			{
				delete pT;
			}
			T* pT;
			int nCount;
		};
	 
		// 统一共享的指针,依靠引用计数来释放
	private:
		CCountT *pCountT;
	 
		void CopyData(const CMySmartPtr& p)
		{
			p.pCountT->nCount++;
			this->pCountT = p.pCountT;
		}
	 
		void DeleteData()
		{
			if (pCountT && --pCountT->nCount==0)
			{
	 
				delete pCountT;
				pCountT = NULL;
			}
		}
	};

posted @ 2019-04-04 23:19  ningKing  阅读(137)  评论(0编辑  收藏  举报