C++中的异常处理(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。
先看下面的代码:
- int main()
- {
- int *i=new int(10);
- /*
- 这中间的代码出现异常
- */
- delete i;
- return 0;
- }
如果出现了这样的情况,动态分配的内存就不会被释放。为了处理这样的问题,可以使用C++标准库auto_ptr类。
如果使用下面的代码,内存就一定会被释放
- #include<memory>
- int main()
- {
- std::auto_ptr<int> ptr(new int(10));
- /*
- 这中间的代码出现异常
- */
- return 0;
- }
auto_ptr类是接受一个类型形参的模板,它为动态分配的对象提供异常安全。auto_ptr类在头文件memory中定义。
- auto_ptr<T> ap 创建名为ap的未绑定的auto_ptr对象
- auto_ptr<T> ap(p) 创建名为ap的auto_ptr对象,ap拥有指针p指向的对象。该构造函数为explicit
- auto_ptr<T> ap1(ap2) 创建名为ap1的auto_ptr对象,ap1保存原来存储在ap2中的指针。ap2将所有权转给ap1,ap2成为未绑定的auto_ptr对象。
- ap1=ap2 将所有权转给ap1.删除ap1指向的对象,并使ap1指向ap2指向的对象,使ap2成为未绑定的
- *ap 返回ap绑定对象的引用
- ap-> 返回ap保存的指针
- ap.reset(p) 如果p与ap的值不同,则删除ap指向的对象并且将ap绑定到p
- ap.release() 返回ap保存的指针并且使ap成为未绑定的
- 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所指对象是否为空
- #include<memory>
- #include<iostream>
- #include<string>
- using namespace std;
- int main()
- {
- std::auto_ptr<string> ptr(new string("HELLO"));
- /*
- 这中间的代码出现异常,内存照样回收
- */
- cout<<*ptr<<endl;
- string s=*ptr;
- *ptr="zhycheng";
- cout<<*ptr<<endl<<(ptr->empty())<<endl;
- /*
- 这中间的代码出现异常,内存照样回收
- */
- return 0;
- }
复制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++中的异常处理(二)的更多相关文章
- Java中的异常处理(二)
1.finally package second; public class C { public static void main(String[] args){ String name = nul ...
- C++中的异常处理(一)
来自:CSDN 卡尔 后续有C++中的异常处理(二)和C++中的异常处理(三),C++中的异常处理(二)是对动态分配内存后内部发生错误情况的处理方法,C++中的异常处理(三)中是使用时的异常说明. ...
- java 中的异常处理
一. 异常的概念和Java异常体系结构 异常是程序运行过程中出现的错误.本文主要讲授的是Java语言的异常处理.Java语言的异常处理框架, 是Java语言健壮性的一个重要体现. Java把 ...
- Delphi中的异常处理(10种异常来源、处理、精确处理)
一.异常的来源 在Delphi应用程序中,下列的情况都比较有可能产生异常. 1.文件处理 2.内存分配 3.windows资源 4.运行时创建对象和窗体 5.硬件和操作系统冲突 6.网络问题 7.数据 ...
- Swift中的异常处理
swift中的异常处理 如果在调用系统某一个方法时,该方法最后有一个throws.说明该方法会抛出异常.如果一个方法会抛出异常,那么需要对该异常进行处理 *在swift中提供三种处理异常的方式 方式一 ...
- Python基础---python中的异常处理
Python中的异常处理 一.什么是异常处理 python解释器检测到错误,触发异常(也允许程序员自己触发异常) 程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关) ...
- .NET中的异常处理机制(一)
1.异常处理的总体指导思想 学习C#中的异常处理机制,大概要了解以下几点: 首先,我们需要知道的事所有具体异常都是继承自System.Exception基类的. 其次,要熟悉FCL类库内置好的一些异常 ...
- python中的异常处理机制
python中的异常处理 1.什么是异常 异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止),在python中,错误触发的异 ...
- 2017.10.28 针对Java Web应用中错误异常处理方法的运用
针对Java Web应用中错误异常处理方法的运用 在javaweb中其异常都需要对Checked Exception之下的Exception进行继承,并且有选择地对发生的错误和异常进行处理.Java同 ...
随机推荐
- Java集合---Arrays类源码解析
一.Arrays.sort()数组排序 Java Arrays中提供了对所有类型的排序.其中主要分为Primitive(8种基本类型)和Object两大类. 基本类型:采用调优的快速排序: 对象类型: ...
- [CareerCup] 9.11 Parenthesize the Expression 表达式加括号
9.11 Given a boolean expression consisting of the symbols 0,1, &, |, and ^, and a desired boolea ...
- 学习笔记——Ant
首先找个视频,你不可否认视频的确是入门最快的学习方式.入门学习视频(共两集)点我去观看 然后找一本入门级的资料看 ANT基础使用手册.pdf 现在你可以看看其他人写的脚本.估计简单的都能看懂. 然后找 ...
- c#字符串转换为日期,支持任意字符串
文章关键字: c#字符串转换为日期 c#日期转换字符串 字符串转换日期 字符串转换为date 整数转换为字符串 浮点数转换为字符串 字符串转换为时间 将字符串转换为时间 字符转 ...
- 开源搜索引擎Iveely 0.7.0发布,不一样,那就让他不一样!
2012年08月05日,Iveely Search Engine 0.1.0发布,今天,怀着对于未来的追求,终于,0.7.0如期和大家见面了,7个版本,历时2年4个月,感谢大家的支持,感谢我不离不弃的 ...
- angular(常识)
我觉得angularjs是前端框架,而jquery只是前端工具,这两个还是没有可比性的. 看知乎上关于jquery和angular的对比http://www.zhihu.com/question/27 ...
- JavaWeb 项目开发中的技术总结
前言: 在项目开发过程中的一点点指导思想 1.环境准备 win系统 Eclipse 开发平台 maven tomcat Mysql 数据库,mysql5.6 操作数据库的jar 包 JDBC 连接数据 ...
- Spring-事物传播行为
spring事物的传播属性(7种) REQUIRED(默认) 业务方法需要在一个容器里运行.如果方法运行时,已经处在一个事务中,那么加入到这个事务,否则自己新建一个新的事务. 存在事物,则使用当前事物 ...
- [Asp.net mvc] 在Asp.net mvc 中使用MiniProfiler
MiniProfiler是Stack Overflow团队设计的一款性能分析的小程序.可以对一个页面本身,及该页面通过直接引用.Ajax.Iframe形式访问的其它页面进行监控,监控内容包括数据库内容 ...
- Cocos2d-X3.0 刨根问底(五)----- Node类及显示对象列表源码分析
上一章 我们分析了Cocos2d-x的内存管理,主要解剖了 Ref.PoolManager.AutoreleasePool这三个类,了解了对象是如何自动释放的机制.之前有一个类 Node经常出现在各种 ...