C++构造函数异常(二)
继续上一篇文章提到的构造异常话题,下面继续谈另外两个场景,即多继承构造异常,以及智能指针构造异常
第3:对多继承当中,某个基类构造异常,而其他基类已构造成功,则构造成功的基类不会析构,由编译器负责回收
1 class B{ 2 3 public: 4 B(){ 5 age = 0; 6 cout << "construct B default" << endl; 7 throw 0;//抛出异常 8 } 9 10 ~B(){ 11 cout << "destructor B ,age=" << age << endl; 12 } 13 private: 14 int age; 15 }; 16 17 class C{ 18 public: 19 C(){ 20 //得到指定范围[m,n]的随机数:r = rand()%(n - m + 1) + m; 21 int r = rand()%(8-0)+0; 22 num = r; 23 cout << "constuctor C ,num = " << num << endl; 24 25 } 26 ~C(){ 27 cout << "destructor C, num = " << num << endl; 28 } 29 private: 30 int num; 31 }; 32 33 class D:public C, public B{ 34 35 public: 36 D(){ 37 cout << "constructor D " << endl; 38 } 39 40 ~D(){ 41 cout << "destrcutor D" << endl; 42 } 43 }; 44 45 int main(void){ 46 47 48 D d; 49 50 }
class B 默认构造函数抛出异常,而class C 默认构造函数是成功的,但并不会调用C的析构函数,由编译器回收
注释第7行的throw 0后则是下面结果:
第4:智能指针, 使用stl容器存放shared_ptr<T> 对象,若T构造函数发生异常,则前面成功构造的对象由编译器负责回收,见代码
1 class C{ 2 public: 3 C(){ 4 //得到指定范围[m,n]的随机数:r = rand()%(n - m + 1) + m; 5 int r = rand()%(8-0)+0; 6 num = r; 7 cout << "constuctor C ,num = " << num << endl; 8 if(!(r % 4)){ 9 throw r;//当随机数r为4的倍数时抛出异常 10 } 11 } 12 ~C(){ 13 cout << "destructor C, num = " << num << endl; 14 } 15 private: 16 int num; 17 }; 18 19 int main(void){ 20 21 typedef shared_ptr<C> spc; 22 vector <spc> vc; 23 for(auto i = 0; i < 10; i++){ 24 vc.push_back( spc(new C()) ); 25 } 26 }
结果如下:当C构造函数中num等于4直接throw 异常
若注释第9行的throw r,则vector中所有元素都构造成功,main函数结束,调用C析构函数
好了,大概就这几种情况,其他没有列举的场景,你不妨再试一下,我相信结果是一样的
结论:但构造函数发生异常,其之前成功构造的基类成员、类成员、初始化列表,stl存放的智能对象都由编译器负责回收,程序员无权过问,也不需过问。
以上所有代码都是在Ubuntu 14.04(64)测试,如果有问题,欢迎指出。
转载于:https://www.cnblogs.com/geeker/p/4393319.html
C++构造函数异常(二)相关推荐
- C# 未找到类型“***”上的构造函数异常原因
在通过反射机制Activator.CreateInstance(Type),进行对象创建的过程中,**发生了"未找到类型"*"上的构造函数"**异常,最后发现是 ...
- java提高篇(十七)-----异常(二)
五.自定义异常 Java确实给我们提供了非常多的异常,但是异常体系是不可能预见所有的希望加以报告的错误,所以Java允许我们自定义异常来表现程序中可能会遇到的特定问题,总之就是一句话:我们不必拘泥于J ...
- 实例化bean中有@Autowired注解的有参构造函数(二)
接着上一篇继续分析有参构造函数: 伪代码: @Autowiredpublic AutowiredConstructorBean(SC sc,CQ cq) {System.out.println(sc) ...
- 【日常Exception】第二十二回:构造函数异常Cannot construct instance of `xx.xxx` (no Creators, like default construct
热门系列: 程序人生,精彩抢先看 1.问题 近期忙于开发,自测时发现了如题的一个异常.主要报错信息先贴一下: with root cause com.fasterxml.jackson.databin ...
- SEH转化为C++异常二
//============================================================================== // // 项目名 : // 文件名 ...
- Python -- 文件和异常(二) — 写入文件
写入文件 保存数据的最简单的方式之一是将其写入到文件中.通过将输出写入文件,即便关闭包含程序输出的终端窗口,这些输出也依然存在:你可以在程序结束运行后查看这些输出,可与别人分享输出文件,还可编写程序来 ...
- 深入理解Java虚拟机(二)Java内存区域与内存溢出异常
一.前言 对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,不容易出现内存泄漏和内存溢出问题,看起来由虚拟机管理内存一切都很美好 ...
- 02 Java程序员面试宝典视频课程之异常
一.Java 中,处理异常的两大步是? 答 捕获异常 声明异常 二.如果 catch 两个异常,一个是父类,一个是子类.这两个异常的 catch 顺序如何确定? 答 子类异常在前父类异常在后 三.fi ...
- Symbian手记【二】 —— Symbian对象构造
[二] Symbian对象构造 C++的纯手工内存管理,确实是一个万恶之源.在对象构造时,有一个著名的内存泄漏隐患问题.比如一个类如下: class A { public: A() ...
- C++复制控制:拷贝构造函数
一.拷贝构造函数是一种特殊构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用.与默认构造函数一样 ,拷贝构造函数可由编译器隐式调用.拷贝构造函数应用的场合为: (1)根据另一个同类 ...
最新文章
- MathWorks的AI之路:面向工业场景,打通开发到部署的全链路
- Oracle分区表详解 .
- “数据分析”如何作用于“用户研究”?--转载微博
- SAP 电商云 Spartacus UI feature level directive 的工作原理
- S5PV210的启动过程:三星推荐的启动方式和uboot的实现方式不同
- puppeteer执行js_使用Node.js和Puppeteer与表单和网页进行交互– 2
- kotlin 16进制_Kotlin程序将八进制数转换为十进制数
- 将COleDateTime类型数据转换成char *数据
- 【lucene】高级搜索篇
- Populating Additional data in Material master record
- 我写了一个“文本转手写”神器来搞定作业!
- PLL与PHY的连接:通道绑定或者不绑定
- linux 编译java web_linux:搭建java web环境
- 如何选择jquery版本
- Sentaurus TCAD SDevice 实例教程
- 华为U9508一键root
- 苹果11触屏不灵敏_苹果iPhone11Pro屏幕失灵怎么办
- 教你10分钟组装台式电脑
- 新浪搜狐网易等那些老牌互联网公司现在都怎样了?
- U3D游戏开发效率和UE4相比哪个高?
热门文章
- 大前端-全栈-node+easyui+express+vue+es6+webpack+react
- thinkphp中AJAX返回ajaxReturn()方法分析
- ZOJ 3229 有上下界最大流
- JWT结合Springboot+shiro,session、token同时存在来应对不同的业务场景(物联网设备管理及开放api)...
- “敏捷开发”怎么就“敏捷”了
- Docker容器实现SSH连接
- ES6的一个基础类,支持私有属性和方法,支持event和mix
- 实验7 OpenGL光照
- 如何删除DNN网站中管理菜单中的一些项
- Ztree 改 节点