智能指针(一)

智能指针是实现自主的内存回收机制, C++中动态开辟内存需要程序员手动开辟、手动释放。然而有可能会出现程序员忘了释放,产生内存泄漏。引入智能指针就可以有效的避免这个问题,我们都知道栈上的空间是由系统开辟系统释放,而堆上的空间是由程序员手动开辟手动释放,智能指针结合堆栈开辟空间的特点,实现由程序员手动开辟,系统自动释放的内存回收机制。

智能指针就是让栈上的对象指向堆上的内存空间,当程序结束时,栈上的对象调用析构函数,释放空间时可以把指向堆上的空间一起释放。

常见的智能指针有

C++98:auto_ptr

C++11:unique_ptr、share_ptr、weak_ptr

auto_ptr

auto_ptr<int>ap2 = ap1;  //取消ap1对内存块的控制 

特点:所有权唯一  
            旧智能指针对象赋给新智能指针对象,取消旧智能指针的所有权 。

缺点:所有权转移导致旧智能指针提前失效  

template<typename T>
class Auto_Ptr
{
public:
	Auto_Ptr(T* ptr)
		:mptr(ptr)
	{}
	Auto_Ptr(Auto_Ptr<T>& rhs)
	{
		mptr = rhs.Release();
	}
	Auto_Ptr<T>& operator=(Auto_Ptr<T>& rhs)
	{
		if (this != &rhs)
		{
			delete mptr;
			mptr = rhs.Release();
		}
		return *this;
	}
	~Auto_Ptr()
	{
		delete mptr;
		mptr = NULL;
	}
	T& operator*()
	{
		return *mptr;
	}
	T* operator->()
	{
		return mptr;
	}
private:
	T* Release()
	{
		T* ptmp = mptr;
		mptr = NULL;
		return ptmp;
	}
	T* mptr;
};

int main()
{
	//int* p = new int;
	std::auto_ptr<int> ap1(new int);
	std::auto_ptr<int> ap2 = ap1;
	*ap1 = 20;

	//int* p = new int;
	//int* q = p;
	return 0;
}

unique_ptr:

特点:所有权唯一

           禁止拷贝和移地,一个智能指针指向一个堆内存

template<typename T>
class Unique_Ptr
{
public:
	Unique_Ptr(T* ptr)
		:mptr(ptr)
	{}
	Unique_Ptr()
	{
		delete mptr;
		mptr = NULL;
	}
	T& operator*()
	{
		return *mptr;
	}
	T* operator->()
	{
		return mptr;
	}
private:
	Unique_Ptr(Unique_Ptr<T>&);
	Unique_Ptr<T>& operator=(Unique_Ptr<T>&);
	T* mptr;
};
int main()
{
	int* p = new int;
	Unique_Ptr<int> up1(p);
	Unique_Ptr<int> up2(p);
	Unique_Ptr<int> up3(p);
	return 0;
}

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值