C++构造函数异常(二)
继续上一篇文章提到的构造异常话题,下面继续谈另外两个场景,即多继承构造异常,以及智能指针构造异常
第3:对多继承当中,某个基类构造异常,而其他基类已构造成功,则构造成功的基类不会析构,由编译器负责回收
 class B{
 public:
     B(){
         age = ;
         cout << "construct B default" << endl;
         throw ;//抛出异常
     }
     ~B(){
         cout << "destructor B ,age=" << age << endl;
     }
 private:
     int age;
 };
 class C{
 public:
     C(){
         //得到指定范围[m,n]的随机数:r = rand()%(n - m + 1) + m;
         int r = rand()%(-)+;
         num = r;
         cout << "constuctor C ,num = " << num << endl;
     }
     ~C(){
         cout << "destructor C, num = " << num << endl;
     }
 private:
     int num;
 };
 class D:public C, public B{
 public:
     D(){
         cout << "constructor D " << endl;
     }
     ~D(){
         cout << "destrcutor D" << endl;
     }
 };
 int main(void){
     D d;
 }
class B 默认构造函数抛出异常,而class C 默认构造函数是成功的,但并不会调用C的析构函数,由编译器回收

注释第7行的throw 0后则是下面结果:

第4:智能指针, 使用stl容器存放shared_ptr<T> 对象,若T构造函数发生异常,则前面成功构造的对象由编译器负责回收,见代码
 class C{
 public:
     C(){
         //得到指定范围[m,n]的随机数:r = rand()%(n - m + 1) + m;
         int r = rand()%(-)+;
         num = r;
         cout << "constuctor C ,num = " << num << endl;
         if(!(r % )){
             throw r;//当随机数r为4的倍数时抛出异常
         }
     }
     ~C(){
         cout << "destructor C, num = " << num << endl;
     }
 private:
     int num;
 };
 int main(void){
     typedef shared_ptr<C> spc;
     vector <spc> vc;
     for(auto i = ; i < ; i++){
         vc.push_back( spc(new C()) );
     }
 }
结果如下:当C构造函数中num等于4直接throw 异常

若注释第9行的throw r,则vector中所有元素都构造成功,main函数结束,调用C析构函数

好了,大概就这几种情况,其他没有列举的场景,你不妨再试一下,我相信结果是一样的
结论:但构造函数发生异常,其之前成功构造的基类成员、类成员、初始化列表,stl存放的智能对象都由编译器负责回收,程序员无权过问,也不需过问。
以上所有代码都是在Ubuntu 14.04(64)测试,如果有问题,欢迎指出。
C++构造函数异常(二)的更多相关文章
- C++构造函数异常(一)
		
C++ 构造函数的异常是一个比较难缠的问题,很多时候,我们可能不去考虑这些问题,如果被问到,有人可能会说使用RAII管理资源. 但你真的考虑过如果构造函数失败了,到底会发生什么吗,前面构造成功的成员. ...
 - java提高篇(十七)-----异常(二)
		
承接上篇博文:java提高篇-----异常(一) 五.自定义异常 Java确实给我们提供了非常多的异常,但是异常体系是不可能预见所有的希望加以报告的错误,所以Java允许我们自定义异常来表 ...
 - java 异常二
		
一 捕获异常try…catch…finally 捕获:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理 捕获异常格式: try { //需要被检测的语句. } catch(异 ...
 - 【C++学习之路】派生类的构造函数(二)
		
二.有内嵌对象的派生类 1.一般来说,我们会这样定义构造函数 student( int i, string nam, int pid, string pnam, int sid) : person( ...
 - C++构造函数(二)
		
本篇是介绍C++的构造函数的第二篇(共二篇),属于读书笔记,对C++进行一个系统的复习. 复制构造函数 复制构造函数是构造函数的一种,也被称为拷贝构造函数,他只有一个参数,参数类型是本类的引用.默认构 ...
 - C++异常~二 转
		
Linux 下 C++ 异常处理技巧 处理固有语言局限性的四种技术 处理 C++ 中的异常会在语言级别上遇到少许隐含限制,但在某些情况下,您可以绕过它们.学习各种利用异常的方法,您就可以生产更可靠的应 ...
 - Java异常(二) 《Effective Java》中关于异常处理的几条建议
		
概要 本章是从<Effective Java>摘录整理出来的关于异常处理的几条建议.内容包括:第1条: 只针对不正常的情况才使用异常第2条: 对于可恢复的条件使用被检查的异常,对于程序错误 ...
 - javascript创建对象之构造函数模式(二)
		
对上一章节的工厂模式进行代码重写 function Human(name, sex) { this.name = name; this.sex = sex; this.say = function ( ...
 - 赋值、复制构造函数和构造函数 & 异常安全的赋值
		
异常安全的赋值 需要注意,复制赋值和复制构造,相兼容. 赋值时候,要带上自检查.
 
随机推荐
- phpStorm debug
			
1.重点注意(重要) 如果是wamp,那么请通过wamp打开php.ini文件,不要自己去找php文件夹下的php.ini,这是两个不同的文件 2.开始配置php.ini zend_extension ...
 - 2019杭电多校第⑨场B Rikka with Cake (主席树,离散化)
			
题意: 给定一块n*m的矩形区域,在区域内有若干点,每个顶点发出一条射线,有上下左右四个方向,问矩形被分成了几个区域? 思路: 稍加观察和枚举可以发现,区域数量=射线交点数+1(可以用欧拉定理验证,但 ...
 - Prim算法生成迷宫
			
初始化地图 function initMaze(r,c){ let row = new Array(2 * r + 1) for(let i = 0; i < row.length; i++){ ...
 - python 类和对象下
			
类的常用函数 issubclass() 检测一个类是否是另外一个类的子类 格式1:issubclass(被检测类,父类) 返回值:布尔值 格式1:issubclass(被检测类,(父类1,父类2,父类 ...
 - c# 读取和写入excel数据
			
1. 读取 DataTable GetDataFromExcelByConn(bool hasTitle = false){ OpenFileDialog openFile = new Open ...
 - 二、python基础之列表、元组
			
一.列表 列表的概念: 列表由一系列按特定顺序排列的元素组成.你可以创建包含字母表中所有字母.数字0-9或所有家庭成员姓名的列表:也可以将任何东西加入列表中,其中的元素之间没有任何关系.鉴于列表通常包 ...
 - ubuntu  安装 docker
			
安装命令 sudo apt-get update sudo apt-get install docker.io 启动docker后台服务 sudo service docker start 1.删除镜 ...
 - linux 命令 - ls(列出目录内容)
			
ls - 列出目录内容 语法: ls (选项) (参数) 选项: -a:显示所有档案及目录(ls内定将档案名或目录名称为“.”的视为影藏,不会列出): -A:显示除影藏文件“.”和“..”以外的所有文 ...
 - Tensorflow读取大数据集的方法,tf.train.string_input_producer()和tf.train.slice_input_producer()
			
1. https://blog.csdn.net/qq_41427568/article/details/85801579
 - AD中快速按模块摆放器件
			
AD中快速按模块摆放器件 在PCB布局的过程中,我们需要将元器件按照功能模块进行放置,如果一个一个去寻找则很麻烦,现在介绍一个快捷的方法: 1.首先在原理图中按照模块选中,然后快捷键 T+S跳转到PC ...