auto_ptr 源码解析

原创 2016年08月29日 20:17:34

就是acclerated c++中所说的 通用句柄类,具体见注释!

#define _THROW0() noexcept

template<class _Ty>
	class auto_ptr;

template<class _Ty>
	struct auto_ptr_ref
		{	// proxy reference for auto_ptr copying
	explicit auto_ptr_ref(_Ty *_Right)
		: _Ref(_Right)
		{	// construct from generic pointer to auto_ptr ptr
		}

	_Ty *_Ref;	// generic pointer to auto_ptr ptr
	};

template<class _Ty>
	class auto_ptr
		{	// wrap an object pointer to ensure destruction
public:
	typedef auto_ptr<_Ty> _Myt;
	typedef _Ty element_type;

	/*explicit TODO 只用于修饰这个函数吗*/
	explicit auto_ptr(_Ty *_Ptr = 0) _THROW0()
		: _Myptr(_Ptr)
		{	// construct from object pointer
		}

	auto_ptr(_Myt& _Right) _THROW0()
		: _Myptr(_Right.release())
		{	// construct by assuming pointer from _Right auto_ptr
		}

		//TODO
	auto_ptr(auto_ptr_ref<_Ty> _Right) _THROW0()
		{	// construct by assuming pointer from _Right auto_ptr_ref
		_Ty *_Ptr = _Right._Ref;
		_Right._Ref = 0;	// release old
		_Myptr = _Ptr;	// reset this
		}

		//TODO 类型强制转换
	template<class _Other>
		operator auto_ptr<_Other>() _THROW0()
		{	// convert to compatible auto_ptr
		return (auto_ptr<_Other>(*this));//TODO 把一个类类型直接转换为另一个类类型,这里就是把auto_ptr<class1>类型,转换为auto_ptr<class2>类型;实质就是指针类型的转换; 
		}
	
		//TODO 类型强制转换
	template<class _Other>
		operator auto_ptr_ref<_Other>() _THROW0() //
		{	// convert to compatible auto_ptr_ref
		_Other *_Cvtptr = _Myptr;	// test implicit conversion
		auto_ptr_ref<_Other> _Ans(_Cvtptr);
		_Myptr = 0;	// pass ownership to auto_ptr_ref
		return (_Ans);
		}

		//由于auto_ptr模板类中只有一个指针成员,所以这里的赋值函数的类型,很宽泛,可以与自身的类型不同
	template<class _Other>
		_Myt& operator=(auto_ptr<_Other>& _Right) _THROW0()
		{	// assign compatible _Right (assume pointer)
		reset(_Right.release());
		return (*this);
		}

	template<class _Other>
		auto_ptr(auto_ptr<_Other>& _Right) _THROW0()
		: _Myptr(_Right.release())
		{	// construct by assuming pointer from _Right
		}

	_Myt& operator=(_Myt& _Right) _THROW0()
		{	// assign compatible _Right (assume pointer)
		reset(_Right.release());
		return (*this);
		}

		// TODO
	_Myt& operator=(auto_ptr_ref<_Ty> _Right) _THROW0()
		{	// assign compatible _Right._Ref (assume pointer)
		_Ty *_Ptr = _Right._Ref;
		_Right._Ref = 0;	// release old
		reset(_Ptr);	// set new
		return (*this);
		}

	~auto_ptr() _NOEXCEPT
		{	// destroy the object
		delete _Myptr;
		}

	_Ty& operator*() const _THROW0()
		{	// return designated value
 #if _ITERATOR_DEBUG_LEVEL == 2
		if (_Myptr == 0)
			_DEBUG_ERROR("auto_ptr not dereferencable");
 #endif /* _ITERATOR_DEBUG_LEVEL == 2 */

		return (*get());
		}

	_Ty *operator->() const _THROW0()
		{	// return pointer to class object
 #if _ITERATOR_DEBUG_LEVEL == 2
		if (_Myptr == 0)
			_DEBUG_ERROR("auto_ptr not dereferencable");
 #endif /* _ITERATOR_DEBUG_LEVEL == 2 */

		return (get());
		}

	_Ty *get() const _THROW0()
		{	// return wrapped pointer
		return (_Myptr);
		}

	_Ty *release() _THROW0()
		{	// return wrapped pointer and give up ownership
		_Ty *_Tmp = _Myptr;
		_Myptr = 0;
		return (_Tmp);
		}

	void reset(_Ty *_Ptr = 0)
		{	// destroy designated object and store new pointer
		if (_Ptr != _Myptr)
			delete _Myptr;
		_Myptr = _Ptr;
		}

private:
	_Ty *_Myptr;	// the wrapped object pointer
	};


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

auto_ptr源码解析

C++ STL的auto_ptr实现(位于memory头文件中)如下: // TEMPLATE CLASS auto_ptr template class auto_ptr; //au...

C++ 只能指针 auto_ptr 原理 解析 源码

By SmartPtr(http://www.cppblog.com/SmartPtr/) auto_ptr是当前C++标准库中提供的一种智能指针,或许相对于boost库提供的一系列眼花缭乱的智...

智能指针 auto_ptr 源码解析

原文地址:http://www.cppblog.com/SmartPtr/archive/2007/07/05/27549.html auto_ptr是当前C++标准库中提供的一种智能指针,或许相对...

auto_ptr类的源码注解

源码及注释如下,这比记忆语法好多了!个人认为,auto_ptr类设计地不行,比如都不能作为参数传递(传递后实参就没用了),失去了C指针的经典优势! // auto_ptr类的简化版,删除了有关aut...
  • Justme0
  • Justme0
  • 2012年10月21日 21:08
  • 979

STL 源码研读笔记(1)– auto_ptr

本文作者:campos 本文出处:http://www.mykernelspace.com  (转载请保留此行,谢谢)       很久没上来写东西了,最近认真学习了一下C++,发现真是博大精深...

《STL源码剖析》---_auto_ptr.h阅读笔记

auto_ptr是常用的智能指针,其实现很简单,源代码也很短,但是中间有个代理类auto_ptr_ref用的很巧妙,值得学习。...

auto_ptr源码剖析

auto_ptr是当前C++标准库(STL)中提供的一种智能指针,包含头文件 #include 便可以使用。auto_ptr 能够方便的管理单个堆内存对象,下面贴出SGI中的auto_ptr源码。...

基于auto_ptr源码的智能指针实现

智能指针某些情况下能够避免内存泄露,这里我做了一次重复制造轮子,目的是为了深入理解智能指针的实现原理。这里只实现了auto_point,根据原理我们不难推出其他智能指针的实现方式。...

auto_ptr源码分析

auto_ptr是当前C++标准库中提供的一种智能指针,或许相对于boost库提供的一系列眼花缭乱的智能指针, 或许相对于Loki中那个无所不包的智能指针,这个不怎么智能的智能指针难免会黯然失色。诚然...

C++:浅谈c++资源管理以及对[STL]智能指针auto_ptr源码分析,左值与右值

C++:浅谈c++资源管理以及对[STL]智能指针auto_ptr源码分析标签:STL 智能指针 auto_ptr 源码分析by 小威威// 2016.05.01 对第三部分源码分析中的复制构造函...
  • linwh8
  • linwh8
  • 2016年04月28日 00:31
  • 3849
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:auto_ptr 源码解析
举报原因:
原因补充:

(最多只允许输入30个字)