2012-11-24 20:56 1713人阅读 评论(2) 收藏 举报
 分类:
C++编程语言(24) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

先看下面的代码:

  1. int main()
  2. {
  3. int *i=new int(10);
  4. /*
  5. 这中间的代码出现异常
  6. */
  7. delete i;
  8. return 0;
  9. }

如果出现了这样的情况,动态分配的内存就不会被释放。为了处理这样的问题,可以使用C++标准库auto_ptr类。

如果使用下面的代码,内存就一定会被释放

  1. #include<memory>
  2. int main()
  3. {
  4. std::auto_ptr<int> ptr(new int(10));
  5. /*
  6. 这中间的代码出现异常
  7. */
  8. return 0;
  9. }

auto_ptr类是接受一个类型形参的模板,它为动态分配的对象提供异常安全。auto_ptr类在头文件memory中定义。

  1. auto_ptr<T> ap    创建名为ap的未绑定的auto_ptr对象
  2. auto_ptr<T> ap(p) 创建名为ap的auto_ptr对象,ap拥有指针p指向的对象。该构造函数为explicit
  3. auto_ptr<T> ap1(ap2) 创建名为ap1的auto_ptr对象,ap1保存原来存储在ap2中的指针。ap2将所有权转给ap1,ap2成为未绑定的auto_ptr对象。
  4. ap1=ap2           将所有权转给ap1.删除ap1指向的对象,并使ap1指向ap2指向的对象,使ap2成为未绑定的
  5. *ap               返回ap绑定对象的引用
  6. ap->              返回ap保存的指针
  7. ap.reset(p)       如果p与ap的值不同,则删除ap指向的对象并且将ap绑定到p
  8. ap.release()      返回ap保存的指针并且使ap成为未绑定的
  9. ap.get()          返回ap保存的指针

auto_ptr只能用于管理从new返回的一个对象,它不能管理动态分配的数组。auto_ptr对象在复制和赋值的时候有不同寻常的行为,所以不能将auto_ptr存放到保准库容器类型中。

当auto_ptr对象超出作用域或者被撤销的时候,就会自动释放aotu_ptr保存指针指向对象的内存。

auto_ptr是可以保存任何类型指针的模板

初始化auto_ptr对象的时候,使用如下方法

auto_ptr<int> i(new int(10));

如下初始化是错误的:

auto_ptr<int> i=new int(10);

i所指的由new表达式创建的对象在超出作用域时自动删除。如果i是局部对象,i所指对象在定义i的块的末尾删除;如果发生异常,则i也超出作用域,析构函数将自动运行i的析构函数作为异常处理的一部分;如果i是全局对象,就在程序末尾删除i引用的对象。

如下代码:

auto_ptr<string> ptr(new string("HELLO"));

*ptr="HELLO";   //改变ptr所保存的指针所指对象的内容

string s=*ptr;     //返回ptr所保存指针所指对象

if(ptr->empty())  //判断ptr所指对象是否为空

  1. #include<memory>
  2. #include<iostream>
  3. #include<string>
  4. using namespace std;
  5. int main()
  6. {
  7. std::auto_ptr<string> ptr(new string("HELLO"));
  8. /*
  9. 这中间的代码出现异常,内存照样回收
  10. */
  11. cout<<*ptr<<endl;
  12. string s=*ptr;
  13. *ptr="zhycheng";
  14. cout<<*ptr<<endl<<(ptr->empty())<<endl;
  15. /*
  16. 这中间的代码出现异常,内存照样回收
  17. */
  18. return 0;
  19. }

复制auto_ptr对象的时候,如下

auto_ptr<int> ap1(ap2);

那么ap1将获得ap2所保存指针的管理,ap2将会变为未绑定

如果是赋值的话

ap3=pa2;

将删除ap3保存的指针所指对象

ap3置为ap2所指对象

ap2未绑定

如果不给定初始化式,ptr的值为0,对0指针解引用,程序出错并且没有定义会发生什么事。使用VC++的编译器的情况是程序崩溃。

可以使用ptr.get()获得ptr保存的指针来判断ptr是否绑定。

auto_ptr的reset函数接受一个指针,来改变auto_ptr保存的指针,如果新指针与旧指针不同,则删除旧指针所指对象的空间。相同的话就没什么改变。

auto_ptr要注意如下四点:

1.不要使用auto_ptr对象保存指向静态分配内存对象的指针

2.不要使用两个auto_ptr对象保存同一指针

3.不要使用auto_ptr保存动态分配数组的指针

4.不要将auto_ptr对象存储在容器中

C++中的异常处理(二)的更多相关文章

  1. Java中的异常处理(二)

    1.finally package second; public class C { public static void main(String[] args){ String name = nul ...

  2. C++中的异常处理(一)

     来自:CSDN 卡尔  后续有C++中的异常处理(二)和C++中的异常处理(三),C++中的异常处理(二)是对动态分配内存后内部发生错误情况的处理方法,C++中的异常处理(三)中是使用时的异常说明. ...

  3. java 中的异常处理

    一. 异常的概念和Java异常体系结构  异常是程序运行过程中出现的错误.本文主要讲授的是Java语言的异常处理.Java语言的异常处理框架,     是Java语言健壮性的一个重要体现. Java把 ...

  4. Delphi中的异常处理(10种异常来源、处理、精确处理)

    一.异常的来源 在Delphi应用程序中,下列的情况都比较有可能产生异常. 1.文件处理 2.内存分配 3.windows资源 4.运行时创建对象和窗体 5.硬件和操作系统冲突 6.网络问题 7.数据 ...

  5. Swift中的异常处理

    swift中的异常处理 如果在调用系统某一个方法时,该方法最后有一个throws.说明该方法会抛出异常.如果一个方法会抛出异常,那么需要对该异常进行处理 *在swift中提供三种处理异常的方式 方式一 ...

  6. Python基础---python中的异常处理

    Python中的异常处理 一.什么是异常处理 python解释器检测到错误,触发异常(也允许程序员自己触发异常) 程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关) ...

  7. .NET中的异常处理机制(一)

    1.异常处理的总体指导思想 学习C#中的异常处理机制,大概要了解以下几点: 首先,我们需要知道的事所有具体异常都是继承自System.Exception基类的. 其次,要熟悉FCL类库内置好的一些异常 ...

  8. python中的异常处理机制

    python中的异常处理 1.什么是异常 异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止),在python中,错误触发的异 ...

  9. 2017.10.28 针对Java Web应用中错误异常处理方法的运用

    针对Java Web应用中错误异常处理方法的运用 在javaweb中其异常都需要对Checked Exception之下的Exception进行继承,并且有选择地对发生的错误和异常进行处理.Java同 ...

随机推荐

  1. ios 定位 航向检测

    // ViewController.m // CoreLocation框架的基本使用—定位 // 注意 点: 1.设置地位可用 2. 设置允许本程序定位(对弹出的框,允许即可) 3. 为模拟器 设置位 ...

  2. linux(centos 6.4)下安装php memcache服务端及其客户端(详细教程)

    前言 在搭建个人博客时,由于没有使用任何框架,纯手工code前台和后台,导致遇到许多问题,其中一个问题就是mysql连接导致的页面相应速度异常低.在查询各种途径后,只能考虑使用memcache缓存.在 ...

  3. LeetCode:Best Time to Buy and Sell Stock I II III

    LeetCode:Best Time to Buy and Sell Stock Say you have an array for which the ith element is the pric ...

  4. LeetCode 笔记25 Candy (艰难的调试)

    There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...

  5. Linux第四次学习笔记

    程序的机器级表示 寻址方式的演变 DOS → 8086 → IA32 Inter处理器系列俗称x86,其演变过程(根据其所需要的晶体管数量来说明): 8086 → 80286 → i386 → i48 ...

  6. Android Studio上方便使用butterknife注解框架的偷懒插件Android Butterknife Zelezny

    首先提下ButterKnifey已经更新到版本7.0.1了,现在注解已经不叫@InjectView了,而叫@Bind,感觉更贴合语义.同时注册的方式也从 ButterKnife.inject(this ...

  7. Java Web技术总结(目录)

    来源于:http://www.jianshu.com/p/539bdb7d6cfa Java Web技术经验总结(一) Java Web技术经验总结(二) Java Web技术经验总结(三) Java ...

  8. 另一套Oracle SQL练习题,更新参考答案

    题干: create table student( sno ) primary key, sname ), sage ), ssex ) ); create table teacher( tno ) ...

  9. Spring-事物配置

    Spring框架支持事务管理的核心是事务管理器抽象,对于不同的数据访问框架(如Hibernate)通过实现策略接口PlatformTransactionManager,从而能支持各种数据访问框架的事务 ...

  10. 10 个免费的 jQuery 可视化编辑器插件

    富文本编辑器,也就是所见即所得的 HTML 编辑器,是网站一个非常重要的组件,特别是对于一些内容发布网站来说.本文介绍 10 个基于 jQuery 的可视化文本编辑器. MarkitUp markIt ...