1.vc
template<class _Ty>
class auto_ptr
{
public:
typedef _Ty element_type;
auto_ptr(_Ty *_P = 0) : _Owns(_P != 0), _Ptr(_P)
{}
//拷贝构造 将_Y的管理权_Owns = false 释放后将指针赋值过去
auto_ptr(const auto_ptr<_Ty>& _Y) : _Owns(_Y._Owns), _Ptr(_Y.release())
{}
auto_ptr<_Ty>& operator=(const auto_ptr<_Ty>& _Y) _THROW0()
{
if(this != &_Y)//防止字赋值
{
if (_Ptr != _Y.get())
{
if (_Owns)
delete _Ptr;//当Owns为真的时候,释放其ptr所指的空间
_Owns = _Y._Owns;
}
else if (_Y._Owns)
_Owns = true;
_Ptr = _Y.release();//
}
return (*this);
}
~auto_ptr()
{
//程序结束时析构函数被调用,释放空间
if (_Owns)
delete _Ptr;
}
//重载*后,具有和指针相似的访问形式
_Ty& operator*() const _THROW0()
{
return (*get());
}
_Ty *operator->() const _THROW0()
{
return (get());
}
_Ty *get() const _THROW0()
{
return (_Ptr);
}
_Ty *release() const _THROW0()//只是将Owns置为false,没有改变指针指向
{
((auto_ptr<_Ty> *)this)->_Owns = false;
return (_Ptr);
}
private:
bool _Owns;
_Ty *_Ptr;
};
int main()
{
int *p = (int *)malloc(sizeof(int));
*p = 3;
int *q = (int *)malloc(sizeof(int));
*q = 5;
auto_ptr<int> pa(p);
auto_ptr<int> pb(q);
pa = pb;
cout<<*pa<<endl;//此时输出都是5
cout<<*pb<<endl;//输出5
return 0;
}
如上图
2.linux
template<class _Ty>
class auto_ptr
{
public:
explicit auto_ptr(_Ty *p = 0):_M_Ptr(p)
{
}
~auto_ptr()
{
delete _M_Ptr;
}
auto_ptr(auto_ptr<_Ty> &_Y):_M_Ptr(_Y.release())
{
}
_Ty& operator *()
{
return *_M_Ptr;
}
_Ty& operator ->()
{
return (*this)->_M_Ptr;
}
auto_ptr<_Ty> &operator =(auto_ptr<_Ty> & _Y)//不同之处
{
reset(_Y.release());
return *this;
}
_Ty* release()
{
_Ty *_tmp = _M_Ptr;
_M_Ptr = 0;//linux下将指针置为空,此时若访问转移权限
return _tmp;
}
void reset(_Ty *_ptr = 0)//重置对指针的管理
{
_Ty * _pt = _M_Ptr;
if(_ptr!=_pt)
{
delete _pt;//先delete掉前指针的空间,避免造成内存泄漏
}
_M_Ptr = _ptr;
}
private:
_Ty* _M_Ptr;//与vc下不同的是没有权限标志
};
pb连访问的机会也失去了。。。。。
如有错误,欢迎前辈们指点,嘿嘿。
转载于:https://blog.51cto.com/10979088/1850852