C++中的异常处理(二)
2016-06-29 18:24
134 查看
C++中的异常处理(二)
标签: c++C++异常处理2012-11-24 20:56 1713人阅读 评论(2) 收藏 举报
分类:
C++编程语言(24)
版权声明:本文为博主原创文章,未经博主允许不得转载。
先看下面的代码:
[cpp] view plain copy
int main()
{
int *i=new int(10);
/*
这中间的代码出现异常
*/
delete i;
return 0;
}
如果出现了这样的情况,动态分配的内存就不会被释放。为了处理这样的问题,可以使用C++标准库auto_ptr类。
如果使用下面的代码,内存就一定会被释放
[cpp] view plain copy
#include<memory>
int main()
{
std::auto_ptr<int> ptr(new int(10));
/*
这中间的代码出现异常
*/
return 0;
}
auto_ptr类是接受一个类型形参的模板,它为动态分配的对象提供异常安全。auto_ptr类在头文件memory中定义。
[cpp] view plain copy
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所指对象是否为空
[cpp] view plain copy
#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++中的异常处理(一)
- 快排算法及利用快排思想寻找第k大(小)的数
- C++ ------------排序算法(冒泡排序-快速排序-选择排序-插入排序-希尔排序)
- C语言版iso8583报文拆包组包代码
- 一些程序段分析(1)
- notepad++编辑器打开一个文件时,给文件添加信息
- C++中的using
- C++中四种进程或线程同步互斥的控制方法
- 判断100-200内的素数
- 探讨C语言中关键字volatile的含义
- 欧几里得算法求n个数据的最大公约数
- 虚拟现实-VR-UE4-创建C++版工程
- C语言__attribute__
- C++自定义数据类型
- C语言之预处理命令与用typedef命名已有类型
- 用c语言编写猜随机数的游戏
- CEF3开发者系列之JS与C++交互之一
- C++著名类库
- vs2010中的静态编译
- C++编码转换函数整理