智能指针的实现

#pragma once
#include<iostream>
using namespace std;

//原理:资源的转移   解决的问题:释放指针
//缺陷:如果一个指针通过拷贝构造和赋值运算符重载将管理的空间交给其他指针,则原指针是没有办法访问这块空间了

#if 0
template<class T>
class AutoPtr
{
public:
	AutoPtr(T* ptr = NULL)
		:_ptr(ptr)
	{}

	AutoPtr(AutoPtr<T>& ap)
		:_ptr(ap._ptr)
	{
		ap._ptr = NULL;
	}

	AutoPtr<T>& operator=(AutoPtr<T>& ap)
	{
		if (this != &ap)
		{
			if (_ptr)
				delete _ptr;
			_ptr = ap._ptr;
			ap._ptr = NULL;
		}
		return *this;
	}

	T& operator*()
	{
		return *_ptr;
	}

	T* operator->()
	{
		return _ptr;
	}

	~AutoPtr()
	{
		if (_ptr)
		{
			delete _ptr;
		}
	} 
private:
	T* _ptr;
};

#endif


#if 0
//多添加一个bool类型的变量,用于对空间绝对拥有权的标记 
template<class T>
class AutoPtr
{
public:
	AutoPtr(T* ptr = NULL)
		:_ptr(ptr)
		, _owner(false)
	{
		if (_ptr)
		{
			_owner = true;
		}
	}

	AutoPtr(const AutoPtr<T>& ap)
		:_ptr(ap._ptr)
		, _owner(ap._owner)
	{
		ap._owner = false;
	}

	AutoPtr<T>& operator=(const AutoPtr<T>& ap)
	{
		if (this != &ap)
		{
			if (_ptr&&_owner)
				delete _ptr;

			_ptr = ap._ptr;
			_owner = ap._owner;
			ap._owner = false;
		}
		return *this;
	}

	~AutoPtr()
	{
		if (_ptr && _owner)
		{
			delete _ptr;
			_ptr = NULL;
			_owner = false; 
		}
	}

	T& operator*()
	{
		return *_ptr;
	}

	T* operator->()
	{
		return _ptr;
	}

private: 
	T* _ptr;
	mutable bool _owner;//对空间绝对拥有权的标记   
};

void FunTest()
{
	AutoPtr<int> ap1(new int);
	AutoPtr<int> ap2(ap1);
	AutoPtr<int> ap3;

	*ap1 = 10;
	*ap2 = 20;
	ap3 = ap2;
}

#endif


#if 0
//ScopedPtr(unique_ptr):同一块空间只能供一个对象运用,一个对象只能由一个对象管理
//原理:防止拷贝构造函数和赋值运算符重载拷贝对象,就不会引起多个对象共同管理同一块空间
//做法:将拷贝构造函数和赋值运算符重载放入到私有成员列表中
//问题:不能够调用拷贝构造函数和赋值运算符重载对对象进行拷贝
template<class T>
class ScopedPtr
{
public:
	ScopedPtr(T* ptr = NULL)
		:_ptr(ptr)
	{}
	
	~ScopedPtr()
	{
		if (_ptr)
		{
			delete _ptr;
		}
	}

	T& operator*()
	{
		return *_ptr;
	}

	T* operator->()
	{
		return _ptr;
	}

	/*
private:
	ScopedPtr(const ScopedPtr<T>& sp)
	{}

	ScopedPtr<T>& operator=(const ScopedPtr<T>& sp)
	{
		return *this;
	}

	*/
private:
	ScopedPtr(const ScopedPtr<T>& sp);
	ScopedPtr<T>& operator=(const ScopedPtr<T>& sp);
private:
	T* _ptr;
};

#endif


#if 0
//定制删除器   给使用不同方式开辟内存空间的指针,定制与其相匹配的释放方式的相关函数
//函数指针

void FClose(FILE* fp)
{
	if (fp)
		fclose(fp);
	fp = NULL;
}

template<class T>
void Free(T* p)
{
	if (p)
	{
		free(p);
		p = NULL;
	}
}

template<class T>
void Delete(T* p)
{
	if (p)
	{
		Delete p;
		p = NULL;
	}
}

typedef void(*PFD)(void*);

template<class T>
class ScopedPtr
{
public:
	ScopedPtr(T* ptr = NULL, PFD defDestory = Delete<T>)
		:_ptr(ptr)
		, _defDestory(defDestory)
	{}

	~ScopedPtr()
	{
		if (_ptr)
		{
			_defDestory(_ptr);
		}
		/*if (_ptr)
		{
			delete _ptr;
		}*/
	}

	T& operator*()
	{
		return *_ptr;
	}

	T* operator->()
	{
		return _ptr;
	}

	/*
	private:
	ScopedPtr(const ScopedPtr<T>& sp)
	{}

	ScopedPtr<T>& operator=(const ScopedPtr<T>& sp)
	{
	return *this;
	}

	*/
private:
	ScopedPtr(const ScopedPtr<T>& sp);
	ScopedPtr<T>& operator=(const ScopedPtr<T>& sp);
private:
	T* _ptr;
	PFD _defDestory;
};

#endif

//伪函数:设置不同类型释放方式的类  传参的时候以便识别类型

template<class T>
class DefDes
{
public:
	void operator()(T* ptr)
	{
		if (ptr)
		   delete ptr;
	}
};

template<class T>
class Free
{
public:
	void operator()(T* ptr)
	{
		if (ptr)
		{
			free(ptr);
			ptr = NULL;
		}
	}
};


class FClose
{
public:
	void operator()(FILE* pf)
	{
		if (pf)
		{
			fclose(pf);
			pf = NULL;
		}
	}
};

template<class T,class Dp = DefDes<T>>
class ScopedPtr
{
public:
	ScopedPtr(T* ptr = NULL)
		:_ptr(ptr)
	{}

	~ScopedPtr()
	{
		if (_ptr)
		{
			Dp destory;
			destory(_ptr);
			//Dp()(_ptr);
		}
	}

	T& operator*()
	{
		return *_ptr;
	}

	T* operator->()
	{
		return _ptr;
	}

	/*
	private:
	ScopedPtr(const ScopedPtr<T>& sp)
	{}

	ScopedPtr<T>& operator=(const ScopedPtr<T>& sp)
	{
	return *this;
	}

	*/
private:
	ScopedPtr(const ScopedPtr<T>& sp);
	ScopedPtr<T>& operator=(const ScopedPtr<T>& sp);
private:
	T* _ptr;
};

void FunTest()
{
	ScopedPtr<int> sp0(new int);
	ScopedPtr<int,Free<int>> sp1((int*)malloc(sizeof(int)));
	FILE* pf = fopen("1.txt", "rb");
	ScopedPtr<FILE,FClose> sp2(pf);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值