C++ auto_ptr

auto_ptr 智能指针

智能指针的实现原理:资源分配即初始化
定义一个来封装资源的分配和释放,在构造函数中完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放。
实现机制:利用累的构造和析构函数是由编译器自动调用的。
智能指针使用:管理指针执行对象的释放问题。可以像指针一样使用。
所在头文件#include ,在C++中auto_ptr是为了解决资源泄露的问题提供的一个只能指针类模板。
为了防止资源泄露,通常在构造函数中申请,析构函数中释放。但只有构造函数调用成功,析构函数才会被调用;若在构造函数 中产生了异常,那么析构函数将不会被调用,这样就会造成资源的泄露。
比如,如果该类有2个成员变量,指向两个资源,在构造函数中申请资源A成功,但申请资源B失败,则构造函数失败,那么析构函数不会被调用,那么资源A则泄漏。为了解决这个问题,我们可以利用auto_ptr取代普通指针作为成员变量,这样首先调用成功的成员变量的构造函数肯定会调用其析构函数,那么就可以避免资源泄漏问题。
1, auto_ptr类

auto_ptr是一个模板类,定义如下:

template <typename Type>
class auto_ptr {...};

它存储的是一个指向Type的指针。
顾名思义,auto_ptr是一种智能指针,它包含一个动态分配内存的指针,并在它生命周期结束的时候,销毁包含的指针所指向的内存。
在C++中, 如果的构造函数只有一个参数时, 那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象. 即构造函数调用时采用了隐式转换。explicit关键字取消了隐式转换
auto_ptr的类构造函数采用了explicit关键字,因此

 auto_ptr<int> pt = new int(123); //error!构造函数声明为explicit

2, auto_ptr构造函数

构造函数1explicit auto_ptr(Type* _Ptr = 0) throw( );

            auto_ptr<int> pt;                           //包含一个int*的指针,并初始化为NULL
            auto_ptr<int> pt(new int(123)); //包含一个int*的指针,并初始化为123的地址
            auto_ptr<int> pt = new int(123); //error!构造函数声明为explicit


构造函数2auto_ptr(auto_ptr<Type>& _Right) throw( );

            int* ptr = new int();
            auto_ptr<int> pt1(ptr); //构造函数1
            auto_ptr<int> pt2(pt1); //将pt1的使用权转给pt2,注意pt1指向NULL了
                                    //pt1调用了本身的release()函数,将内部指针地址传给pt2

构造函数3template<typename Other>       
                auto_ptr(auto_ptr<Other>& _Right) throw( );
                          声明这样一个拷贝构造函数的目的,就是为了派生类指针能转换成基类的指针。
例:
      class Base { };
      class Derived : public Base { };
      auto_ptr<Derived> pDerived(new Derived);
      auto_ptr<Base>    pBase(pDerived);           //让这样的代码能通过编译器
           其本质是为了让,auto_ptr类内部的Derived*转换为Base* 

构造函数4auto_ptr(auto_ptr_ref<Type> _Right) throw( );

                        //暂略
3auto_ptr成员函数

成员函数1:Type* get( ) const throw( );
                    获得包含指针的地址
                   int* ptr = new int(123);
                   auto_ptr<int> pt(ptr);
                   assert(pt.get() == ptr); //相等,指向同一地址
成员函数2:Type* release( ) throw( );
                    返回包含指针的地址,并将包含指针设为NUll

                   string* pstr = new string("hello");
                   auto_ptr<string> pt(pstr);
                   pt.release();   //不在指向string对象
                                       //此时,pt.get()等于NULL
                   delete pstr;    //应该手动删除pstr指向的内存块 


成员函数3void reset(Type* _Ptr = 0);
                   double* pdouble1 = new double(3.14);
                   double* pdouble2 = new double(1.23);
                   auto_ptr<double> pt1(pdouble1);
                   pt1.reset(pdouble2);  //将删除pt1所指向的内存块就是pdouble1指向的那块

         //此时,pt.get()等于pdouble2

          cout << *pdouble1;   //error,pdouble已经是野指针了           
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值