c++从c那里继承了高效且灵活的指针,但是使用起来稍微不注意就会导致内存泄漏、野指针、访问越界等问题。
智能指针就很好地解决了这样的问题。
vs自带智能指针 auto_ptr
template<class _Ty>
class auto_ptr
{
public:
typedef auto_ptr<_Ty> _Myt;
typedef _Ty element_type;
public:
explicit auto_ptr(_Ty *_Ptr = 0):_Myptr(_Ptr){}
~auto_ptr()
{
delete _Myptr;
}
auto_ptr(_Myt& _Right): _Myptr(_Right.release()){}
_Myt& operator=(_Myt& _Right)
{
reset(_Right.release());
return (*this);
}
_Ty& operator*() const
{
return (*get());
}
_Ty *operator->() const
{
return (get());
}
_Ty *get()const
{
return (_Myptr);
}
_Ty *release()
{
_Ty *_Tmp = _Myptr;
_Myptr = 0;
return (_Tmp);
}
void reset(_Ty *_Ptr = 0)
{
if (_Ptr != _Myptr)
delete _Myptr;
_Myptr = _Ptr;
}
private:
_Ty *_Myptr;
};
boost库中的局部指针 scoped_ptr
template <class T> class scoped_ptr
{
private:
T * px;
scoped_ptr(scoped_ptr const&); //禁止拷贝构造
scoped_ptr& operator=(scoped_ptr const&); //禁止赋值
typedef scoped_ptr<T> this_type;
void operator==( scoped_ptr const& )const; //禁止比较
void operator!=( scoped_ptr const& )const;
public:
typedef T element_type;
explicit scoped_ptr(T *p = 0):px(p){}
// explicit scoped_ptr(std::auto_ptr<T>p):px(p.release()){}
~scoped_ptr()
{
delete px;
}
void reset(T * p = 0) //巧妙地通过临时对象的析构删除了以前管理的空间
{
this_type(p).swap(*this);
}
void swap(scoped_ptr & b)
{
T * tmp = b.px;
b.px = px;
px = tmp;
}
T & operator*() const
{
return *px;
}
T * operator->() const
{
return px;
}
T * get() const
{
return px;
}
};
/*boost scoped_array*/
template<class T> class scoped_array
{
private:
T * px;
scoped_array(scoped_array const &); //禁止拷贝
scoped_array & operator=(scoped_array const &); //禁止赋值
typedef scoped_array<T> this_type;
void operator==( scoped_array const& ) const; //禁止比较
void operator!=( scoped_array const& ) const;
public:
typedef T element_type;
explicit scoped_array( T * p = 0 ):px(p){}
~scoped_array()
{
delete []px;
}
T & operator[](std::ptrdiff_t i) const
{
return px[i];
}
public:
void reset(T * p = 0)
{
this_type(p).swap(*this);
}
void swap(scoped_array & b)
{
T * tmp = b.px;
b.px = px;
px = tmp;
}
T * get() const
{
return px;
}
智能指针就很好地解决了这样的问题。
vs自带智能指针 auto_ptr
template<class _Ty>
class auto_ptr
{
public:
typedef auto_ptr<_Ty> _Myt;
typedef _Ty element_type;
public:
explicit auto_ptr(_Ty *_Ptr = 0):_Myptr(_Ptr){}
~auto_ptr()
{
delete _Myptr;
}
auto_ptr(_Myt& _Right): _Myptr(_Right.release()){}
_Myt& operator=(_Myt& _Right)
{
reset(_Right.release());
return (*this);
}
_Ty& operator*() const
{
return (*get());
}
_Ty *operator->() const
{
return (get());
}
_Ty *get()const
{
return (_Myptr);
}
_Ty *release()
{
_Ty *_Tmp = _Myptr;
_Myptr = 0;
return (_Tmp);
}
void reset(_Ty *_Ptr = 0)
{
if (_Ptr != _Myptr)
delete _Myptr;
_Myptr = _Ptr;
}
private:
_Ty *_Myptr;
};
boost库中的局部指针 scoped_ptr
template <class T> class scoped_ptr
{
private:
T * px;
scoped_ptr(scoped_ptr const&); //禁止拷贝构造
scoped_ptr& operator=(scoped_ptr const&); //禁止赋值
typedef scoped_ptr<T> this_type;
void operator==( scoped_ptr const& )const; //禁止比较
void operator!=( scoped_ptr const& )const;
public:
typedef T element_type;
explicit scoped_ptr(T *p = 0):px(p){}
// explicit scoped_ptr(std::auto_ptr<T>p):px(p.release()){}
~scoped_ptr()
{
delete px;
}
void reset(T * p = 0) //巧妙地通过临时对象的析构删除了以前管理的空间
{
this_type(p).swap(*this);
}
void swap(scoped_ptr & b)
{
T * tmp = b.px;
b.px = px;
px = tmp;
}
T & operator*() const
{
return *px;
}
T * operator->() const
{
return px;
}
T * get() const
{
return px;
}
};
/*boost scoped_array*/
template<class T> class scoped_array
{
private:
T * px;
scoped_array(scoped_array const &); //禁止拷贝
scoped_array & operator=(scoped_array const &); //禁止赋值
typedef scoped_array<T> this_type;
void operator==( scoped_array const& ) const; //禁止比较
void operator!=( scoped_array const& ) const;
public:
typedef T element_type;
explicit scoped_array( T * p = 0 ):px(p){}
~scoped_array()
{
delete []px;
}
T & operator[](std::ptrdiff_t i) const
{
return px[i];
}
public:
void reset(T * p = 0)
{
this_type(p).swap(*this);
}
void swap(scoped_array & b)
{
T * tmp = b.px;
b.px = px;
px = tmp;
}
T * get() const
{
return px;
}
};
除了vc自带的auto_ptr,还有四种智能指针。