智能指针----auto_ptr

C++的auto_ptr是一个智能指针,用于自动管理动态分配的内存,防止内存泄漏。它在构造和析构时自动调用delete来释放资源。然而,auto_ptr存在一些问题,如拥有权转移后的访问不便、可能导致内存崩溃,以及不适用于STL容器。在C++11中,auto_ptr已被unique_ptr取代,以提供更安全和更有效的内存管理。
摘要由CSDN通过智能技术生成

c++中的auto_ptr所做的事情就是解决指针没有被释放而导致内存泄漏的问题。有了auto_ptr之后程序员就不用去操心当对象被销毁时释放资源的问题了。

裸指针存在的问题:

在这里插入图片描述
auto_ptr源码:

template <class _Ty>
	class auto_ptr
	{
	private:
		bool _Owns;//指针的拥有权
		_Ty* _Ptr;
	public:
		auto_ptr(_Ty* p = 0) :_Owns(p != nullptr), _Ptr(p)
		{
			//构造函数
		}
		auto_ptr(const auto_ptr<_Ty>& _Y) :_Owns(_Y._Owns), _Ptr(_Y._Ptr)
		{
			//拷贝构造函数
		}
		auto_ptr<_Ty>& operator=(const auto_ptr<_Ty>& _Y)//赋值运算符的重载函数
		{
			if (this != &_Y)
			{
				if (_Ptr != _Y._Ptr)
				{
					if (_Owns)
					{
						delete _Ptr;
					}
					_Owns = _Y._Owns;
					else if (_Y._Owns)
					{
						_Ptr = _Y.release();//拥有权转移函数
						//不用释放堆区的内存空间,只是将拥有权转移到另一个对象,被转移的指针置为nullptr
					}
				}
			}
			return *this;
		}
		~autp_ptr()//析构函数
		{
			if (_Owns)//如果有拥有权也就是有指针指向对象
			{
				delete _Ptr;//将指针所指的堆区空间释放
			}
			_Ptr = nullptr;//该指针置为nullptr
		}
		_Ty& operator*() const//*重载
		{
			return *get();//返回指针所指之物
		}
		_Ty* operator->() const//->重载
		{
			return get();//返回该指针所指对象的地址
		}
		_Ty* release() const//拥有权转移函数
		{
			((auto_ptr<_Ty>*)this)->_Owns = false;
			return _Ptr;
		}
	};

auto_ptr在c++11中已经被弃用,由unique_ptr代替。

主要原因有以下几点:

  • 拥有权转移后不方便再次访问
auto_ptr<string> ps1(new string("hello"));
auto_ptr<string> ps2(ps1);

执行完这个代码之后由于ps1的拥有权转移给了ps2,因此当再去访问ps1这个对象的成员时,就会找不到。

  • 内存崩溃
int *p = new int (0);
auto_ptr<int> p1(p);
auto_ptr<int> p2(p);

本段程序中p1和p2都指向同一块堆区空间,当析构对象的时候同一块内存空间要被释放两次,这必然是不行的。

  • auto_ptr不能被用在标准STL容器中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值