当前位置: 首页 > news >正文

c++ primer plus 第15章友,异常和其他 15.3.11 有关异常的注意事项

c++ primer plus 第15章友,异常和其他 15.3.11 有关异常的注意事项

15.3.11 有关异常的注意事项

文章目录

  • c++ primer plus 第15章友,异常和其他 15.3.11 有关异常的注意事项
  • 15.3.11 有关异常的注意事项


15.3.11 有关异常的注意事项

从前面关于如何使用异常的讨论可知,应在设计程序时就加入异常处理功能,而不是以后再添加。这样做有些缺点。例如,使用异常会增加程序代码,降低程序的运行速度。异常规范不适用于模板,因为模板函数引发的异常可能随特定的具体化而异。异常和动态内存分配并非总能协同工作。下面进一步讨论动态内存分配和异常。首先,请看下面的函数:

void testl(int n)
{
string mesg("I'm trapped in an endless loop");i
if (oh_no)throw exception();...
return;
}

string 类采用动态内存分配。通常,当函数结束时,将为mesg 调用string 的析构函数。虽然 throw语句过早地终止了函数,但它仍然使得析构函数被调用,这要归功于栈解退。因此在这里,内存被正确地管理。
接下来看下面这个函数:

void test2(int n)
{
double*ar = new double[n];...
if (oh_no)
throw exception);
...
delete [] ar;
return;
}

这里有个问题。解退栈时,将删除栈中的变量ar。但函数过早的终止意味着函数末尾的 delete[]语句被忽略。指针消失了,但它指向的内存块未被释放,并且不可访问。总之,这些内存被泄漏了。这种泄漏是可以避免的。例如,可以在引发异常的函数中捕获该异常,在catch块中包含一些清理代码,然后重新引发异常:

void test3(int n)
{
double*ar=new double[n];
try{
if(oh_no)
throw exception()
}
catch(exception & ex)
{delete [] arr;throw;
}
... delete []arr;
return ;
}

然而,这将增加疏忽和产生其他错误的机会。另一种解决方法是使用第16章将讨论的智能指针模板
总之,虽然异常处理对于某些项目极为重要,但它也会增加编程的工作量、增大程序、降低程序的速度。另一方面,不进行错误检查的代价可能非常高。
异常处理

在现代库中,异常处理的复杂程度可能再创新高--主要原因在于文档没有对异常处理例程进行解释或解释得很整脚。任何熟练使用现代操作系统的人都遇到过未处理的异常导致的错误和问题。这些错误背后的程序员通常面临一场艰难的战役,需要不断了解库的复杂性:什么异常将被引发,它们发生的原因和时间,如何处理它们,等等。 程序员新手很快将发现,理解库中异常处理像学习语言本身一样困难,现代库中包含的例程和模式可能像 C++语法细节一样陌生而困难。要开发出优秀的软件,必须花时间了解库和类中的复杂内容,就像必须花时间学习 C++本身一样。通过库文档和源代码了解到的异常和错误处理细节将使程序员和他的软件受益。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SpringBoot新手快速入门系列教程:前述
  • 好看!欢乐!学习快!快来探索《米小圈动画成语》的魅力!
  • Hadoop3:NameNode和DataNode多目录配置(扩充磁盘的技术支持)
  • Android Studio gradle下载失败?!
  • 可视化作品集(11):节能环保能耗领域大展拳脚。
  • 相同含义但不同类型字段作为join条件时注意事项
  • 释放序列和同步
  • 数据库高级操作:分类汇总与排序
  • 心电信号降噪前处理(MATLAB R2018)
  • swift开发用Alamofire的post发送proto序列化消息
  • LLM 研究方向(一): LLM Prompts--p-tuning、LoRA
  • NLP - 基于bert预训练模型的文本多分类示例
  • 盲盒抽卡机小程序:抽卡机的多样化发展
  • OpenCV中使用Canny算法在图像中查找边缘
  • C++中的多重继承和虚继承:横向继承、纵向继承和联合继承;虚继承
  • 【Linux系统编程】快速查找errno错误码信息
  • 03Go 类型总结
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • github从入门到放弃(1)
  • input实现文字超出省略号功能
  • Java程序员幽默爆笑锦集
  • learning koa2.x
  • leetcode讲解--894. All Possible Full Binary Trees
  • Vue.js 移动端适配之 vw 解决方案
  • 闭包,sync使用细节
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 和 || 运算
  • 技术胖1-4季视频复习— (看视频笔记)
  • 深度学习在携程攻略社区的应用
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ​比特币大跌的 2 个原因
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # Java NIO(一)FileChannel
  • #define,static,const,三种常量的区别
  • #define、const、typedef的差别
  • #pragma data_seg 共享数据区(转)
  • (02)Hive SQL编译成MapReduce任务的过程
  • (04)odoo视图操作
  • (152)时序收敛--->(02)时序收敛二
  • (3)STL算法之搜索
  • (6)STL算法之转换
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (阿里云在线播放)基于SpringBoot+Vue前后端分离的在线教育平台项目
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (四)c52学习之旅-流水LED灯
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)程序员技术练级攻略
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .net core 6 redis操作类
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法