Chinaunix首页 | 论坛 | 博客
  • 博客访问: 216819
  • 博文数量: 46
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 482
  • 用 户 组: 普通用户
  • 注册时间: 2014-07-18 14:14
个人简介

小菜鸟

文章分类

全部博文(46)

文章存档

2020年(2)

2017年(7)

2016年(36)

2014年(1)

我的朋友

分类: C/C++

2017-03-09 18:08:34

自动资源释放
auto_ptr 是 C++ 标准库中()为了解决资源泄漏的问题提供的一个智能指针类模板(注意:这只是一种简单的智能指针)
auto_ptr 的实现原理其实就是 RAII,在构造的时候获取资源,在析构的时候释放资源,并进行相关指针操作的重载,使用起来就像普通的指针。
    
正常情况下,delete会顺利的销毁指针p指向的数据.
如果24行发生了异常,则将撤销 vector 而不会释放数组,那么就会发生内存泄漏.
用类管理资源分配
析构函数的运行导致一个更重要的编程技术出现,它使程序更为异常安全的.通过定义一个类来封闭资源的分配和释放,可以保证正确释放资源.这一技术常称为"资源分配即初始化",简称 RAII.
    
如上图,构造函数负责分配资源,析构函数负责释放资源.
auto_ptr 类
auto_ptr 类是接受一个类型形参的模板,在 memory 中定义.
auto_ptr 只能用于管理从 new 返回的一个对象,不能管理动态分配数组.使用 auto_ptr 对象指向动态分配的数组会导致未定义的运行时行为.
上面第一个例子如果24行发生了异常,则将撤销 vector 而不会释放数组,那么就会发生内存泄漏.
如果使用一个 Auto_Ptr 对象来代替,将会自动释放内存.
auto_ptr ap(new string("hello"));
将 auto_ptr 绑定到指针
auto_ptr 是可以保存任何类型指针的模板
auto_ptr pi(new int(1024));// 这个语句将pi初始化未由new表达式创建的对象地址.
查看auto_ptr 的源码可以发现,它的构造函数被声明为 explicit 构造函数,所以必须使用初始化的直接形式来创建 auto_ptr 对象.
auto_ptr pi = new int(1024);//错误
使用 auto_ptr 对象
auto_ptr 类定义了解引用操作符(*)和箭头操作符(->)的重载版本,所以可以使用类似内置指针的方式使用 auto_ptr 对象.
auto_ptr 对象的复制和赋值是破坏性操作
auto_ptr 和内置指针对待复制和赋值有非常关键的重要区别.
复制或者赋值普通指针是复制地址,复制以后,两个指针指向同一个对象.在复制或者赋值 auto_ptr 对象以后,原来的 auto_ptr 对象不指向对象,而新的 auto_ptr 对象(左边的 auto_ptr 对象)拥有基础对象.
    
当复制 auto_ptr 对象的时候,右边的对象让出对基础对象的所有职责,并重置自己为未绑定的 Auto_Ptr 对象后, ap1 不再指向任何对象.删除对象要使用的是 ap2 而不是 ap1.
auto_ptr 的缺陷 
不要使用 auto_ptr 对象保存指向静态分配对象的指针.否则当 auto_prt 被撤销的时候尝试销毁非动态分配的数据,会导致发生未知的行为.
永远不要使用两个 auto_ptr 对象指向同一个对象.
不要使用 auto_ptr 对象指向动态分配的数组指针.因为当 auto_ptr 被撤销的时候它只会释放一个元素,因为它使用的是 delete,而不是用数组的 delete[] 操作符.
不要讲 auto_ptr 对象存储在容器中,因为容器要求两个对象复制赋值后具有相同值.

参考书籍: C++ Premier 第十七章. 
阅读(1385) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~