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

第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++构造函数异常(二)的更多相关文章

  1. C++构造函数异常(一)

    C++ 构造函数的异常是一个比较难缠的问题,很多时候,我们可能不去考虑这些问题,如果被问到,有人可能会说使用RAII管理资源. 但你真的考虑过如果构造函数失败了,到底会发生什么吗,前面构造成功的成员. ...

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

          承接上篇博文:java提高篇-----异常(一) 五.自定义异常 Java确实给我们提供了非常多的异常,但是异常体系是不可能预见所有的希望加以报告的错误,所以Java允许我们自定义异常来表 ...

  3. java 异常二

    一 捕获异常try…catch…finally 捕获:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理 捕获异常格式: try { //需要被检测的语句. } catch(异 ...

  4. 【C++学习之路】派生类的构造函数(二)

    二.有内嵌对象的派生类 1.一般来说,我们会这样定义构造函数 student( int i, string nam, int pid, string pnam, int sid) : person( ...

  5. C++构造函数(二)

    本篇是介绍C++的构造函数的第二篇(共二篇),属于读书笔记,对C++进行一个系统的复习. 复制构造函数 复制构造函数是构造函数的一种,也被称为拷贝构造函数,他只有一个参数,参数类型是本类的引用.默认构 ...

  6. C++异常~二 转

    Linux 下 C++ 异常处理技巧 处理固有语言局限性的四种技术 处理 C++ 中的异常会在语言级别上遇到少许隐含限制,但在某些情况下,您可以绕过它们.学习各种利用异常的方法,您就可以生产更可靠的应 ...

  7. Java异常(二) 《Effective Java》中关于异常处理的几条建议

    概要 本章是从<Effective Java>摘录整理出来的关于异常处理的几条建议.内容包括:第1条: 只针对不正常的情况才使用异常第2条: 对于可恢复的条件使用被检查的异常,对于程序错误 ...

  8. javascript创建对象之构造函数模式(二)

    对上一章节的工厂模式进行代码重写 function Human(name, sex) { this.name = name; this.sex = sex; this.say = function ( ...

  9. 赋值、复制构造函数和构造函数 & 异常安全的赋值

    异常安全的赋值 需要注意,复制赋值和复制构造,相兼容. 赋值时候,要带上自检查.

随机推荐

  1. SSH服务搭建、账号密码登录远程Linux虚拟机、基于密钥的安全验证(Windows_Xshell,Linux)

    问题1:如果是两台虚拟机ping不同且其中一个虚拟机是克隆的另一个,需要更改一下MAC地址,关机状态下 一> "编辑虚拟机设置" 一>" 网络适配器" ...

  2. Embedding和Word2Vec实战

    在之前的文章中谈到了文本向量化的一些基本原理和概念,本文将介绍Word2Vec的代码实现 https://www.cnblogs.com/dogecheng/p/11470196.html#Word2 ...

  3. MSF——Meterpreter(三)

    MSF系列: MSF——基本使用和Exploit模块(一) MSF——Payload模块(二) MSF——Meterpreter(三) MSF——信息收集(四) 一.简介 Meterpreter是Me ...

  4. 容器下载的是centos8的镜像,scp出现packet_write_wait: Connection to **** port 22: Broken pipe 问题解决

    解决方案:在~/.ssh目录新建文件config vi ~/.ssh/config         #Added lines to fix.    Host *    IPQoS lowdelay t ...

  5. casperjs-options

    The Casper class The easiest way to get a casper instance is to use the module's create() method: 最简 ...

  6. Python随笔记录之一

    import os import random from copy import deepcopy ''' 读取特定目录下所有的文件夹, 和文件名 ''' def eachDir(path): for ...

  7. java 调用wsdl的webservice接口 两种调用方式

    关于wsdl接口对于我来说是比较头疼的 基本没搞过.一脸懵 就在网上搜 看着写的都很好到我这就不好使了,非常蓝瘦.谨以此随笔纪念我这半个月踩过的坑... 背景:短短两周除了普通开发外我就接到了两个we ...

  8. linux 应用层常用API/命令

    一 API 1. bsearch NAME bsearch - binary search of a sorted array SYNOPSIS #include <stdlib.h> v ...

  9. c++11 委派构造函数

    委派构造函数可以减少构造函数的书写量: class Info { public: Info() : type(), name('a') { InitRest(); } Info(int i) : ty ...

  10. Ceph的正确玩法之Ceph纠删码理论与实践

    http://blog.itpub.net/31545808/viewspace-2637083/ 注意空格,有的命令少空格 随着云计算业务的快速发展,国内外云计算企业的专利之争也愈发激烈.在云计算这 ...