继续上一篇文章提到的构造异常话题,下面继续谈另外两个场景,即多继承构造异常,以及智能指针构造异常

第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++构造函数异常(二)相关推荐

  1. C# 未找到类型“***”上的构造函数异常原因

    在通过反射机制Activator.CreateInstance(Type),进行对象创建的过程中,**发生了"未找到类型"*"上的构造函数"**异常,最后发现是 ...

  2. java提高篇(十七)-----异常(二)

    五.自定义异常 Java确实给我们提供了非常多的异常,但是异常体系是不可能预见所有的希望加以报告的错误,所以Java允许我们自定义异常来表现程序中可能会遇到的特定问题,总之就是一句话:我们不必拘泥于J ...

  3. 实例化bean中有@Autowired注解的有参构造函数(二)

    接着上一篇继续分析有参构造函数: 伪代码: @Autowiredpublic AutowiredConstructorBean(SC sc,CQ cq) {System.out.println(sc) ...

  4. 【日常Exception】第二十二回:构造函数异常Cannot construct instance of `xx.xxx` (no Creators, like default construct

    热门系列: 程序人生,精彩抢先看 1.问题 近期忙于开发,自测时发现了如题的一个异常.主要报错信息先贴一下: with root cause com.fasterxml.jackson.databin ...

  5. SEH转化为C++异常二

    //============================================================================== // // 项目名 : // 文件名 ...

  6. Python -- 文件和异常(二) — 写入文件

    写入文件 保存数据的最简单的方式之一是将其写入到文件中.通过将输出写入文件,即便关闭包含程序输出的终端窗口,这些输出也依然存在:你可以在程序结束运行后查看这些输出,可与别人分享输出文件,还可编写程序来 ...

  7. 深入理解Java虚拟机(二)Java内存区域与内存溢出异常

    一.前言 对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,不容易出现内存泄漏和内存溢出问题,看起来由虚拟机管理内存一切都很美好 ...

  8. 02 Java程序员面试宝典视频课程之异常

    一.Java 中,处理异常的两大步是? 答 捕获异常 声明异常 二.如果 catch 两个异常,一个是父类,一个是子类.这两个异常的 catch 顺序如何确定? 答 子类异常在前父类异常在后 三.fi ...

  9. Symbian手记【二】 —— Symbian对象构造

    [二] Symbian对象构造 C++的纯手工内存管理,确实是一个万恶之源.在对象构造时,有一个著名的内存泄漏隐患问题.比如一个类如下: class A { public:         A()   ...

  10. C++复制控制:拷贝构造函数

    一.拷贝构造函数是一种特殊构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用.与默认构造函数一样 ,拷贝构造函数可由编译器隐式调用.拷贝构造函数应用的场合为: (1)根据另一个同类 ...

最新文章

  1. MathWorks的AI之路:面向工业场景,打通开发到部署的全链路
  2. Oracle分区表详解 .
  3. “数据分析”如何作用于“用户研究”?--转载微博
  4. SAP 电商云 Spartacus UI feature level directive 的工作原理
  5. S5PV210的启动过程:三星推荐的启动方式和uboot的实现方式不同
  6. puppeteer执行js_使用Node.js和Puppeteer与表单和网页进行交互– 2
  7. kotlin 16进制_Kotlin程序将八进制数转换为十进制数
  8. 将COleDateTime类型数据转换成char *数据
  9. 【lucene】高级搜索篇
  10. Populating Additional data in Material master record
  11. 我写了一个“文本转手写”神器来搞定作业!
  12. PLL与PHY的连接:通道绑定或者不绑定
  13. linux 编译java web_linux:搭建java web环境
  14. 如何选择jquery版本
  15. Sentaurus TCAD SDevice 实例教程
  16. 华为U9508一键root
  17. 苹果11触屏不灵敏_苹果iPhone11Pro屏幕失灵怎么办
  18. 教你10分钟组装台式电脑
  19. 新浪搜狐网易等那些老牌互联网公司现在都怎样了?
  20. U3D游戏开发效率和UE4相比哪个高?

热门文章

  1. 大前端-全栈-node+easyui+express+vue+es6+webpack+react
  2. thinkphp中AJAX返回ajaxReturn()方法分析
  3. ZOJ 3229 有上下界最大流
  4. JWT结合Springboot+shiro,session、token同时存在来应对不同的业务场景(物联网设备管理及开放api)...
  5. “敏捷开发”怎么就“敏捷”了
  6. Docker容器实现SSH连接
  7. ES6的一个基础类,支持私有属性和方法,支持event和mix
  8. 实验7 OpenGL光照
  9. 如何删除DNN网站中管理菜单中的一些项
  10. Ztree 改 节点