C++智能指针(一)

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;
}

};

除了vc自带的auto_ptr,还有四种智能指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值