C++中构造函数和析构函数可以抛出异常吗?
C++中构造函数和析构函数可以抛出异常吗?
一. 析构函数
参照《Effective C++》中条款08:别让异常逃离析构函数。
总结如下:
1. 不要在析构函数中抛出异常!虽然C++并不禁止析构函数抛出异常,但这样会导致程序过早结束或出现不明确的行为。
2. 如果某个操作可能会抛出异常,class应提供一个普通函数(而非析构函数),来执行该操作。目的是给客户一个处理错误的机会。
3. 如果析构函数中异常非抛不可,那就用try catch来将异常吞下,但这样方法并不好,我们提倡有错早些报出来。
二. 构造函数
总结如下:
1. 构造函数中抛出异常,会导致析构函数不能被调用,但对象本身已申请到的内存资源会被系统释放(已申请到资源的内部成员变量会被系统依次逆序调用其析构函数)。
2. 因为析构函数不能被调用,所以可能会造成内存泄露或系统资源未被释放。
3. 构造函数中可以抛出异常,但必须保证在构造函数抛出异常之前,把系统资源释放掉,防止内存泄露。(如何保证???使用auto_ptr???)
最后总结如下:
1. 构造函数中尽量不要抛出异常(可以),能避免的就避免,如果必须,要考虑不要内存泄露!
2. 不要在析构函数中抛出异常!
C++中构造函数和析构函数可以抛出异常吗?相关推荐
- php中的构造函数和析构函数,php 中构造函数和析构函数
构造函数: 在对象实例化时被调用,一个类中只能有一个构造函数,在类中起初始化的作用. 析构函数: 在对象结束时被自动调用. 话不多说,用一段代码来说明两者的区别: //定义一个类 class Pers ...
- 类中构造函数、析构函数与赋值函数的重写
类中构造函数.析构函数与赋值函数的重写 class String { public: String(const char *str = NULL); // 普通构造函数 String(const St ...
- C++中构造函数和析构函数
[注]致力于将知识讲明白!不懂请留言! 构造函数 定义 它是一种特殊的方法.主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中. 另外,一个类可以有 ...
- C# 中构造函数与析构函数(二)
(二)析构函数 析构函数 · 不能在结构中定义析构函数.只能对类使用析构函数. · 一个类只能有一个析构函数. · 无法继承或重载析构函数. · 无法调用析构函数.它们是被自动调用的. · 析构函数既 ...
- 构造函数 和 析构函数 能否抛出异常
构造函数和析构函数分别管理对象的建立和释放,负责对象的诞生和死亡的过程.当一个对象诞生时,构造函数负责创建并初始化对象的内部环境,包括分配内存.创建内部对象和打开相关的外部资源,等等.而当对象死亡时, ...
- C++中构造函数和析构函数的调用顺序
情况一:类B继承类A 结论一:定义变量时:先调用父类的构造函数,再调用派生类的构造函数:变量销毁时:先调用派生类的析构函数,再调用父类的析构函数. #include <iostream> ...
- C++虚继承中构造函数和析构函数顺序问题以及原理
多重继承的问题:多个类B,C,-继承同一个类A导致如果X继承了B,C,-那么在X中将还有多个A中成员的拷贝,如果想要访问A中的成员如果不加名字空间将会导致二义性,这种拷贝大多是没有实际意义的,为了避免 ...
- C++中构造函数和析构函数常见面试题?
构造函数和析构函数常见面试题? 构造函数和析构函数常见面试题? 1.永远不要在构造函数或析构函数中调用虚函数 2.为什么构造函数不能定义为虚函数 3.为什么析构函数可以定义为虚函数 4.构造函数的执行 ...
- C++:39---继承中构造函数、析构函数的关系
一.继承中构造函数的关系 如果父类没有构造函数,则子类初始化时不需要构造父类 如果父类有构造函数,则子类初始化自己的构造函数时,要先初始化父类的构造函数 基类的构造函数必须在派生类的构造函数初始化列表 ...
最新文章
- 同事埋了个坑:Insert into select语句把生产服务器炸了
- es6与java的相似度,特斯拉Model Y对比蔚来ES6!这次对比结果出乎意料
- redis报protocol error的真正原凶
- ASP.NET Core EFCore 之Code First
- 【C 语言】结构体 ( 指针运算与指针内存操作 | 结构体成员偏移量计算 )
- php脏在哪里,逍遥游户外联盟-人身上最“脏”的地方是哪里?3个地方,建议经常清洗 -...
- 架构师未来性的基础:简单性
- 节能prru进入深度休眠节能_2021-2024年中国工业节能行业深度调研及投资前景预测报告...
- 论文浅尝 | Data Intelligence 已出版的知识图谱主题论文
- Redis的五种存储类型和其应用场景
- VTD — 应用于智能驾驶复杂交通场景仿真工具
- 使用EditPlus 3时,如何重新设置HTML Page的Default模板
- 角度计算公式 角度换算 想知道1是多少度; 度和弧度的关系 弧微分: 曲率,曲半径,曲率圆:
- CSAPP第二章家庭作业
- Linux服务器远程连接
- 第三课:布尔逻辑与逻辑门
- 日本恐怖片《二重身》核心内容赏析
- Java的Random练习~~生成1~n之间的随机数
- 百度推广创意怎么写?百度推广创意十大秘籍
- Si基相控阵技术的相关进展1