智能指针之 auto_ptr (pc版与gcc版)

内存管理一直是令程序员头疼的工作,C++继承了C那高效而又灵活的指针,使用起来稍微的不小心就会导致内存泄漏(memory leak),野指针(wild pointer),访问越界(access denied)等问题。曾几何时,C++程序员无比羡慕JAVE,C#等语言的垃圾回收机制。但C++后来有了更高效的内存管理方法,智能指针的出现,使得C++在内存管理方面做得甚至比JAVE,C#更好。智能指针(s
摘要由CSDN通过智能技术生成

内存管理一直是令程序员头疼的工作,C++继承了C那高效而又灵活的指针,使用起来稍微的不小心就会导致内存泄漏(memory leak),野指针(wild pointer),访问越界(access denied)等问题。曾几何时,C++程序员无比羡慕JAVE,C#等语言的垃圾回收机制。但C++后来有了更高效的内存管理方法,智能指针的出现,使得C++在内存管理方面做得甚至比JAVE,C#更好。

智能指针(smart pointer)是C++中热门议题,在没有智能指针之前,程序员必须保证new的对象能在正确的时机dalete,四处编写异常捕获代码释放资源。而智能指针则可以在退出作用域时——不管是正常流程离开或是因异常而离开——总能调用delete来析构在堆上动态分配对象。

智能指针有很多种,今天介绍最简单,也是最有名的C++98标准中的“自动指针”std::auto_ptr。

智能指针的思想是,将构造成一个类似于指针的对象,对象在离开作用域时,会自动调动析构函数将对象析构,这就不用我们手动的去delete掉指针了。
auto_ptr的构造函数接受new操作符或者对象工厂创建出的对象指针作为参数,从而代理了原始指针。虽然它是一个对象,但是因为重载了operator*和operator->,其行为非常类似指针,可以把它用在大多数普通指针可用的地方。当退出作用域时,C++语言会保证auto_ptr对象销毁,调用auto _ptr的析构函数,进而使用delete操作符删除原始指针释放资源。

auto_ptr有两个版本,一个是pc版,指针涉及所有权问题;一个是gcc版本,指针不涉及所有权问题。

先讲解pc版本自动指针。下面列出pc版简写的auto_ptr代码:

template<class _Ty>
class auto_ptr
{
public:
    auto_ptr(_Ty *_P=0) : _Owns(_P!=0),_Ptr(_P)
    {}
    auto_ptr(const auto_ptr<_Ty> &_Y):_Owns(_Y._Owns),_Ptr(_Y.release())
    {}
    auto_ptr<_Ty>& operator=(const auto_ptr<_Ty> &_Y)
    {
        if(this != &_Y)
        {
            if(_Ptr != _Y._Ptr)
            {
                if(_Owns)
                    delete _Ptr;
            }
            //if(_Y._Owns)
            //    _Owns = true;
            _Owns = _Y._Owns;    //转移所有权
            _Ptr = _Y.release(); 
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值