std::Auto_Ptr(仿写)

目录

一、C++参考文档

 二、仿写代码

三、Auto_Ptr遇到的问题


一、C++参考文档

 二、仿写代码

namespace lwc{
	template<class _Ty>
	class My_Auto_ptr {
	private:
		bool _Owns;
		_Ty* _Ptr;
	public:
		//改变对象名称
		typedef _Ty element_type;
		//构造函数
		My_Auto_ptr(_Ty* _ptr=0):_Owns(_ptr!=0),_Ptr(_ptr) {}
		//拷贝赋值皮在拷贝构造或赋值操作时,我们必须作特殊的处理来保证这个特性。auto_ _ptr
        //的做法是"所有权转移”,即拷贝或赋值的源对象将失去对"裸”指针的所有权,所以,与一般拷贝构造函数,赋值函数不同,auto_ptr 的拷贝构造函数,赋值函数的参数为引用用而不是常引用(const reference)。

		My_Auto_ptr(const My_Auto_ptr<_Ty>& _Y) :_Owns(_Y._Owns), _Ptr(_Y._Ptr) {}
		//赋值函数
		My_Auto_ptr<_Ty>& operator=(const My_Auto_ptr<_Ty>& _Y) {
			if (this != &_Y) {
				if (_Ptr != _Y._Ptr) {
					if (_Owns) {
						delete _Ptr;
					}
					_Owns = _Y._Owns;
				}
				else if (_Y._Owns) {
					_Owns = true;
				}
				_Ptr = _Y.release();
			}
			return (*this);
		}
		//析构函数
		~My_Auto_ptr() {
			if (_Owns) {
				delete _Ptr;
			}
			_Ptr = NULL;
		}
		//取对象
		_Ty& operator*()const {
			return (*_Ptr);
		}
		//去指针
		_Ty* operator->()const {
			return _Ptr;
		}
		_Ty* get()const {
			return _Ptr;
		}
		_Ty* realease()const {
			((My_Auto_ptr<_Ty>*)this)->_Owns = false;
			return _Ptr;
		}

	};
}

三、Auto_Ptr遇到的问题


1、因为auto_ptr析构的时候肯定会删除他所拥有的那个对象,所以我们就要注意了,一个萝卜一个坑,两个auto_ptr 不能同时拥有同一个对象。像这样:

 

因为ap1与ap2都认为指针p是归它管的,在析构时都试图删除p,两次删除同一个对象的行为在
C++标准中是未定义的。所以我们必须防止这样使用auto_ ptr。

2、因为auto_ptr 的析构函数中删除指针用的是delete,而不是delete [],所以我们不应该用auto_ ptr 来管理一个数组指针。
3、构造函数的explicit 关键词有效阻止从一个裸指针隐式转换成auto_ ptr 类型。
4、因为auto_ ptr不具有值语义(value semantics),所以auto_ ptr不能被用在stl标准容器中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值