智能指针之auto_ptr

来源:互联网 发布:php var_export 编辑:程序博客网 时间:2024/06/07 10:11

智能指针简单的说它就是有指针和智能两个方面。首先是个指针,其次这个指针有着比平常指针更智能的方面,至于这些智能方面是如何体现的我们在这里一一来讨论:
智能指针在CPP下就是一个行为类似指针的模版类对象,要注意的是在定义智能指针对象的时候不能定义成指针对象。如果想要使用库中的auto_ptr,必须引入到头文件memory,这个文件是模版定义。下面我们来看看auto_otr智能指针的源码,通过解读代码来熟悉这个指针指针模版:

/*说明:    这里的代码是通过阅读源码,在源码的基础上附加了一个在这里称为拥有权的bool数据成员,在这了起到的左右就是通过判断对象是否又拥有权来对空间进行是否时释放的的操作,达到了可以让两个或者多个对象指向同一个空间,但是只有其中一个对象对给空间又拥有权,也只有这个对象才可以释放空间,代码中详见*/#include<iostream>using namespace std;template<class _ty>class auto_ptr{public:    explicit auto_ptr(_ty* p=0) : _Owns(p!=0), px(p)//explicit 拒绝隐式转换    {}    auto_ptr(const auto_ptr<_ty> &r)     {        if(r._Owns)            _Owns = 1;        px = r.release();    }    auto_ptr& operator = ( const auto_ptr &r)    {        if( this != &r)        {            if(r._Owns)                _Owns = 1;            reset(r.release());//release会把r的拥有权通过强转设置为0        }        return *this;    }    ~auto_ptr()    {        if(_Owns)//判断是否又拥有权,只有拥有权的的才能释放        {            delete px;        }    }public:    _ty operator *()    {        if(px == 0)        {            cout<<"auto_ptr not dereferencable"<<endl;        }        return (*get());//    }    _ty operator->()    {        if(px == 0)        {            cout<<"auto_ptr not dereferencable"<<endl;        }        return (get());//    }public:    _ty *get()    {        return px;    }    _ty* release()const    {        if(_Owns != 0)            ((auto_ptr<_ty>*)this)->_Owns = 0;        //(const_cast<auto_ptr<_ty>*>this)->_Owns = 0;        return px;    }    void reset(_ty *p = 0)    {        if(px != p  && _Owns)            delete px;        px = p;    }private:    bool _Owns;    _ty* px;};int main(){    int *p = new int(10);    auto_ptr<int> q(p);    auto_ptr<int> q1 = q;       auto_ptr<int> q2;    q2 = q1;    return 0;}

auto_ptr无法达到的:

1)auto_ptr不能共享所有权,即不要让两个auto_ptr指向同一个对象。(这里的可以)

2)auto_ptr不能指向数组,因为auto_ptr在析构的时候只是调用delete,而数组应该要调用delete[],如果想要指向数组需要自己编写一段代码来实现。

3)auto_ptr只是一种简单的智能指针,如有特殊需求,需要使用其他智能指针,比如share_ptr。

4)auto_ptr不能作为容器对象,STL容器中的元素经常要支持拷贝,赋值等操作,在这过程中auto_ptr会传递所有权,那么source与sink元素之间就不等价了。

体会: 通过阅读优秀代码我们才能有所提高,通过阅读和体会别人代码算法的精髓比我们自己在那冥思苦想写出来的三流代码提升更高,通过琢磨别人写高级代码的算法精妙,同样是处理一种情况但是由于代码的不同可能会是程序在美观上甚至是在内存空间占用和执行时间上有着天差地别的差距,所以我们平时与其在那冥思苦想和钻研自己的三流代码不如提高自己不如通过阅读别人写的一流代码来提升自己。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 lol更新速度3kb怎么办 苹果6s玩游戏卡怎么办 微博手机号换了怎么办 微博字数超了怎么办 海外玩传奇很卡怎么办 再审期限超6个月怎么办 肠粉蒸出来太粘怎么办 微信订阅号没了怎么办 映美620k不进纸怎么办 属虎的带了貔貅怎么办 属龙的不能带金怎么办 这段时间运气不好怎么办 两年运气特别差怎么办 玩手机麻将老输怎么办 打四川麻将老输怎么办 网上打麻将老输怎么办 手机打麻将老输怎么办 近来打麻将老输怎么办 最近手气不好老输钱怎么办 头被风吹了头痛怎么办 打麻将老输怎么办转运 外出时家里的花怎么办 放假了家里的花怎么办 老是怀疑老婆有外遇怎么办 老婆出轨我该怎么办呢 老公爱爱时间短怎么办 老婆离家出走了怎么办离婚呢 4g网络变成h了怎么办 打麻药伤到神经怎么办 40多岁乳房下垂怎么办 手冻了怎么办 小妙招 脸过敏好了还红怎么办 脸过过敏红肿痒怎么办 腰间盘突出压迫神经腿麻怎么办 腰椎盘突出脚麻怎么办 水泡破了化脓了怎么办 泰迪口臭很严重怎么办 狗狗的嘴巴好臭怎么办 2岁宝宝有口臭怎么办 2岁半宝宝口臭怎么办 胃热引起的口臭怎么办