模拟实现智能指针



智能指针:所谓智能指针就是智能/自动化的管理指针所指向的动态资源的释放。

RAII(Resource Acquisition Is Initialization)

资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放。

现在来模拟实现一下auto_ptr,scoped_ptr(守卫,即是防拷贝),shared_ptr(使用引用计数)

#include <iostream>
using namespace std;


//auto_ptr
template<typename T>
class AutoPtr
{
public:
    AutoPtr(T *ptr)
		:_ptr(ptr)
	{}

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

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

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

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

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


//scoped_ptr
template<typename T>
class ScopedPtr
{
public:
    ScopedPtr(T *ptr)
		:_ptr(ptr)
	{}

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

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

	~ScopedPtr()
	{
		delete _ptr;
	}
protected:
	ScopedPtr(ScopedPtr<T>& sp);
	ScopedPtr<T>& operator=(ScopedPtr<T>& sp);
private:
	T *_ptr;
};


//shared_ptr
template<typename T>
class SharedPtr
{
public:
    SharedPtr(T *ptr)
		:_ptr(ptr)
		,_pcount(new int(1))
	{
	}

	SharedPtr(SharedPtr<T>& sp)
		:_ptr(sp._ptr)
		,_pcount(sp._pcount)
	{
		(*_pcount)++;
	}

	SharedPtr<T>& operator=(SharedPtr<T>& sp)
	{
		if(_ptr != sp._ptr)
		{
			if(--(*_pcount) == 0)
			{
				delete _pcount;
				delete _ptr;
			}
			_ptr = sp._ptr;
			_pcount = sp._pcount;
			(*_pcount)++;
		}
		return *this;
	}

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

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

	~SharedPtr()
	{
		if(--(*_pcount) == 0)
		{
			delete _ptr;
			delete _pcount;
		}
	}

private:
	T *_ptr;
	int *_pcount;
};

void Test1()
{
	int *p1 = new int(1);
	int *p2 = new int(2);
	AutoPtr<int> ap1(p1);
	AutoPtr<int> ap2(ap1);
	ap2 = ap1;
}

void Test2()
{
	int *p1 = new int(1);
	int *p2 = new int(2);
	ScopedPtr<int> sp1(p1);
	//ScopedPtr<int> ap4(ap3);
}

void Test3()
{
	int *p1 = new int(1);
	int *p2 = new int(2);
	SharedPtr<int> sp1(p1);
	SharedPtr<int> sp2(sp1);
	SharedPtr<int> sp3(p2);
	sp3 = sp1;
}

int main()
{
	//Test1();
	//Test2();
	Test3();
	return 0; 
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值