C++进阶之路---auto_ptr

智能指针

1.什么是RALL

使用局部对象管理资源的技术,称为资源的获取即初始化。
利用了创建对象时调用构造函数获取资源,当销毁对象时调用析构函数释放资源。RALL更充分的是利用了局部对象,为什么使用局部对象呢?原因是,假如函数中存在一个对象,调用此函数对象被产生,函数结束会调用析构函数,对象被销毁。局部对象是由系统自动管理的

2.裸指针的缺点

裸指针:

直接拿类型定义的指针
在这里插入图片描述

裸指针带来的问题:

在这里插入图片描述

1.无法判断裸指针指向的是一个对象还是一组对象
在这里插入图片描述
2.裸指针只能判断是否为空指针,不能判断其是否为失效指针
3.无法判断一个裸指针是否被释放

3.auto_ptr为什么被C11移除

拿一个auto_ptr对象初始化另一个auto_ptr对象会调用拷贝构造函数,
在这里插入图片描述

原因一

但是调用拷贝构造函数的目的是什么呢?
1.是要求2个对象共享同一资源呢
在这里插入图片描述
带来的问题就是,由于2个对象共享同一资源,当主函数结束时pobjb会先将资源析构,当析构pobja时会对同一个内存空间第二次进行析构是错误的。

原因二

2.还是将一个对象pobja的资源转换给对象pobjb呢
在这里插入图片描述

带来的问题就是
在这里插入图片描述

原因三

在这里插入图片描述

因此使用的场景不明确,拷贝构造的目的不明确,因此C11移除了它;由于析构时指向不明确,所以STL的容器不和auto_ptr玩

4.源码

class Object
{
	int value;
public:
	Object(int x = 0) :value(x)
	{
		cout << "Create Object: " << this << endl;
	}
	~Object()
	{
		cout << "Destory Object: " << this << endl;
	}

	int& Value()
	{
		return value;
	}

	const int& Value()const
	{
		return value;
	}
};

template<class _Ty>
class my_auto_ptr
{
private:
	bool _Owns;   //拥有权
	_Ty* _Ptr;      //指向的资源
public:
	my_auto_ptr(_Ty*p=NULL):_Owns(p!=NULL),_Ptr(p){}
	~my_auto_ptr()
	{
		if (_Owns)
		{
			delete _Ptr;
		}
		_Owns = false;
		_Ptr = NULL;
	}



	_Ty& operator*()const//
	{
		return *_Ptr;
	}

	_Ty* operator->()const
	{
		return &**this;
	}

	void reset(_Ty* p)//重置
	{
		if (_Owns)
		{
			delete _Ptr;
		}
		_Ptr = p;
	}

	_Ty* release()const//释放
	{
		_Ty* tmp = NULL;
		if (_Owns)
		{
			((my_auto_ptr*)this)->_Owns = false;
			tmp = _Ptr;
			((my_auto_ptr*)this)->_Ptr = NULL;
		}
		return tmp;
	}

	/*my_auto_ptr& operator=(const my_auto_ptr& _Y)
	{
		if (this == &_Y)return *this;
		if (_Owns)
		{
			delete _Ptr;
		}
		_Owns = _Y._Owns;
		_Ptr = _Y._Ptr;
		return 0;
	}*/

};

void fun()
{
	my_auto_ptr<Object>obj(new Object(10));
	cout << (*obj).Value() << endl;
	cout << obj->Value() << endl;
}

int main()
{
	my_auto_ptr<Object>pobja(new Object(10));
	my_auto_ptr<Object>pobjb(pobja);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值