STL四种智能指针浅析

本文详细介绍了C++中的四种智能指针:auto_ptr(已被弃用)、unique_ptr、shared_ptr和weak_ptr。auto_ptr存在提前释放的风险,unique_ptr更安全,不支持拷贝;shared_ptr实现资源的共享,通过引用计数管理,而weak_ptr用于解决交叉引用问题。选择智能指针应考虑是否需要共享资源以及程序需求。
摘要由CSDN通过智能技术生成

我们知道,在C++中没有像Java那样的自动回收垃圾机制,,系统只会清理栈上由系统管理的资源,在类中若有对堆资源的申请,不进行手动释放资源就会导致内存泄漏问题,在学习了类和类模板之后,我们发现在类中有析构函数来进行资源释放功能,并且析构函数还支持加入程序员自身的操作,那么将指针托管给对象来实现可以做到程序员手动申请资源,让系统自动回收资源的效果,Boost库就提供了这样的智能指针来实现C++的自动回收机制,引入了智能指针的概念,方便管理堆内存。使用普通指针,容易造成堆内存泄露,二次释放,程序发生异常时内存泄露等问题等,使用智能指针能更好的管理堆内存。

auto_ptr

auto_ptr在C++11已被摒弃,但在实际项目中仍可使用,若想实现auto_ptr的操作,最好还是使用unique_ptr,因为unique_ptr比auto_ptr更加安全,在介绍unique_ptr时会详细介绍。
伪代码如下:

template<typename T>
class SmartPtr
{
public:
	SmartPtr(T* ptr) :mptr(ptr){}
	~SmartPtr()
	{
		delete mptr;
		mptr = NULL;
	}
	SmartPtr(const SmartPtr<T>& rhs)
	{
		mptr = rhs.mptr;
		rhs.Release();
	}
	SmartPtr<T>& operator=(const SmartPtr<T>& rhs)
	{
		if (this != &rhs)
		{
			delete mptr;
			mptr = rhs.mptr;
			rhs.Release();
		}
		return *this;
	}
	T& operator*()
	{
		return *mptr;
	}
	T* operator->()
	{
		return mptr;
	}
private:
	void Release()const // const SmartPtr<T>* const this
	{
		(T*)mptr = NULL;
	}
	T* mptr;
};
int main()
{
	SmartPtr<int> sp1 = new int;
	SmartPtr<int> sp2 = sp1;//sp1.mptr = NULL;
	*sp1 = 10;//error,因为此时sp1.mptr = NULL;,无法再被赋值
	return 0;
}

反映到图中如下:
在这里插入图片描述
当申请一个auto指针后,auto会将堆资源托管到auto对象中,auto不会共享堆资源,只要进行拷贝构造或者是赋值操作时就会对当前auto对象进行Release()操作,将原本的使用权

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值