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同 ...
随机推荐
- 招聘一个靠谱的ios
1. 风格纠错题 修改方法有很多种,现给出一种做示例: 最终改为: 下面对具体修改的地方, 2. 什么情况使用 weak 关键字,相比 assign 有什么不同? 什么情况使用 weak 关键字? 1 ...
- 浅谈JS面向对象之创建对象
hello,everybody,今天要探讨的问题是JS面向对象,其实面向对象呢呢,一般是在大型项目上会采用,不过了解它对我们理解JS语言有很大的意义. 首先什么是面向对象编程(oop),就是用对象的思 ...
- threejs构建web三维视图入门教程
本文是一篇简单的webGL+threejs构建web三维视图的入门教程,你可以了解到利用threejs创建简单的三维图形,并且控制图形运动.若有不足,欢迎指出. 本文使用的框架是three.js gi ...
- 我从腾讯那“偷了”3000万QQ用户数据,出了份很有趣的独家报告!
声明: 1.目前程序已停止运行!QQ空间也已升级访问安全机制. 2.本“分析”数据源自部分用户的公开信息,并未触及隐私内容,广大网友无需担心. 3.QQ空间会不定期发布大数据分析报告,感兴趣的朋友关注 ...
- AutoMapper用法(转载)
申明 本文转载自http://www.qeefee.com/article/automapper 作者:齐飞 配置AutoMapper映射规则 AutoMapper是基于约定的,因此在实用映射之前,我 ...
- Linux 常用工具贴
1. nmon for Linux 用于监控Linux CPU.IO.网络等,可以生产excel格式的报表 http://nmon.sourceforge.net/pmwiki.php?n=Sit ...
- Git.Framework 框架随手记--存储过程简化
在很多的ORM中对存储过程操作都是一个棘手的地方,因为存储过程是一段预编译的代码,其中可以包含很多处理过程.在Git.Framework中也同样存在这样的问题,目前没有能力解决这个问题.但是对于存储过 ...
- NABCD模型进行竞争性需求分析
确定项目:教室管理系统 负责人:李凤娇,高德建 选择比努力更重要.一个项目成功自然离不开组员们的努力.但是,光努力是不够的.还需要用户有需求,能快速实现. 这些东西,看似很虚,却能让我们少走不少弯路. ...
- SpringAOP
首先导包, 我用的是Spring4.0.4;需要这三个包 Spring-AOP-4.0.4.REALEASE.jar + Spring-aspect-4.0.4.REALEASE.jar +aspec ...
- BZOJ1452 [JSOI2009]Count
Description Input Output Sample Input Sample Output 1 2 HINT 正解:二维树状数组 解题报告: 这是一道送肉题.二维树状数组直接维护每种颜色的 ...