博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
理解 auto_ptr<T>
阅读量:6956 次
发布时间:2019-06-27

本文共 1716 字,大约阅读时间需要 5 分钟。

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
2 class auto_ptr 3 { 4 public: 5 auto_ptr(T* ptr):_ptr(ptr) 6 { 7 } 8 9 auto_ptr(auto_ptr
& rhs)10 {11 _ptr = rhs._ptr;12 rhs._ptr = 0;13 }14 15 auto_ptr& operator=(auto_ptr
& 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
27 auto_ptr
(auto_ptr
& rhs)28 {29 _ptr = rhs._ptr;30 rhs._ptr = 0;31 }32 33 template
34 auto_ptr
& operator=(auto_ptr
& 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*() const45 {46 return *_ptr;47 }48 49 T* operator->() const50 {51 return _ptr;52 }53 54 T* get() const55 {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成员。

转载地址:http://edmil.baihongyu.com/

你可能感兴趣的文章
浏览器渲染原理解析
查看>>
搭建个人网站需要的三个步骤
查看>>
matlab建立双坐标
查看>>
Linux操作命令(六)
查看>>
1、压滤机工作原理
查看>>
设计模式学习总结-桥接模式(Bridge Pattern)
查看>>
halcon算子翻译——copy_image
查看>>
使用Haar分类器进行面部检测
查看>>
参数化(四):处理非均匀数据分布
查看>>
Makefile-2
查看>>
获取页面中出现次数最多的三个标签以及出现次数
查看>>
访问WEB-INF目录中的文件
查看>>
web接口开发与测试
查看>>
php -- php控制linux关机、重启、注销
查看>>
867. Transpose Matrix
查看>>
十.python面向对象(itme)
查看>>
Python下selenium的简单用法
查看>>
multiset的应用
查看>>
我的mysql的学习记录
查看>>
Codeforces Round #416 (Div. 2)(A,思维题,暴力,B,思维题,暴力)
查看>>