• 理解 auto_ptr<T>


    1、auto_ptr<T>解决什么问题?

      在堆上获取的资源,客户可能会忘记delete,或者由于异常没有执行到delete,导致资源泄漏。在栈上分配的对象,有个特点,不论出现什么情况,超出作用域后,都将调用析构方法。根据这个特点,可以使用栈上的对象管理指针,析构的时候执行delete,确保一定释放资源。

    2、auto_ptr就是解决这个问题的,auto_ptr就是个资源管理类,它的特点是拥有权转移。

    3、考虑,如果让我来设计auto_ptr,我该怎么做?

      auto_ptr是个资源管理类,对指针封装。有几点需要注意:

      a、可以对不同类型的指针进行封装,因此需要一个模板类。

      b、copy构造,copy赋值的时候,对拥有权转移。

      c、考虑到,不同资源管理类之间的兼容,比如将auto_ptr<Dog>对象赋值给auto_ptr<Animal>,对于copy构造和copy赋值,需要添加对应的模版成员方法。

      d、要让资源管理类,行为像一个指针,因此要重载操作符*,->,它们不改变对象内容,声明为const成员方法。

      e、为了与其它接口兼容,资源管理类必须提供接口get(),暴露内部资源,get()不改变对象内容,声明为const成员方法。

      f、最重要的,析构方法执行delete。

    4、示例代码如下:

     1 template<typename T>
     2 class auto_ptr
     3 {
     4 public:
     5  auto_ptr(T* ptr):_ptr(ptr)
     6  {
     7  }
     8 
     9  auto_ptr(auto_ptr<T>& rhs)
    10  {
    11   _ptr = rhs._ptr;
    12   rhs._ptr = 0;
    13  }
    14 
    15  auto_ptr& operator=(auto_ptr<T>& rhs)
    16  {
    17   if(this != &rhs)
    18   {
    19    this->_ptr = rhs._ptr;
    20    rhs._ptr =0;
    21   }
    22   return *this;
    23  }
    24 
    25 
    26  template <typename U>
    27  auto_ptr<T>(auto_ptr<U>& rhs)
    28  {
    29   _ptr = rhs._ptr;
    30   rhs._ptr = 0;
    31  }
    32 
    33  template <typename U>
    34  auto_ptr<T>& operator=(auto_ptr<U>& rhs)
    35  {
    36   if(this != &rhs)
    37   {
    38    this->_ptr = rhs._ptr;
    39    rhs._ptr =0;
    40   }
    41   return *this;
    42  } 
    43 
    44  T& operator*() const
    45  {
    46   return *_ptr;
    47  }
    48 
    49  T* operator->() const
    50  {
    51   return _ptr;
    52  }
    53 
    54  T* get() const
    55  {
    56   return _ptr;
    57  }
    58 
    59  ~auto_ptr()
    60  {
    61   delete _ptr;
    62  }
    63 
    64 private:
    65  T* _ptr;
    66 
    67  friend class auto_ptr;
    68 };

     5、特别注意:上面为什么加上 friend class auto_ptr?

      在C++中,private成员只能在当前类中访问,只有两层含义:this指针可以访问private成员,同一类型的rhs可以访问private成员。如果rhs和this指针不是同一个类型,不能访问rhs 的private成员。在上面的模版成员方法中,rhs 是另一个类型,为了能访问它的private成员,需要说明auto_ptr之间都是friend,这样才能访问rhs 的private成员。

  • 相关阅读:
    sqlserver中判断表或临时表是否存在
    Delphi 简单方法搜索定位TreeView项
    hdu 2010 水仙花数
    hdu 1061 Rightmost Digit
    hdu 2041 超级楼梯
    hdu 2012 素数判定
    hdu 1425 sort
    hdu 1071 The area
    hdu 1005 Number Sequence
    hdu 1021 Fibonacci Again
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3524493.html
Copyright © 2020-2023  润新知