首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

什么时候可以从C++中的析构函数中抛出异常?

在C++中,析构函数是用于在对象销毁时执行清理操作的。当析构函数被调用时,异常可能会导致程序的控制流发生改变,从而导致未定义的行为。因此,在析构函数中抛出异常是不推荐的。

如果在析构函数中发生错误,应该使用其他方法来处理错误,例如记录错误信息或者将错误信息返回给调用者。在析构函数中使用异常可能会导致程序的行为不可预测,因此应该避免这种做法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++ 函数不要抛出异常

语法上来说,函数可以抛出异常,但从逻辑上和风险控制上,函数不要抛出异常,因为栈展开容易导致资源泄露和程序崩溃,所以别让异常逃离析函数。...1.函数抛出异常问题 函数语法上是可以抛出异常,但是这样做很危险,请尽量不要这要做。...原因在《More Effective C++》中提到两个: (1)如果函数抛出异常,则异常点之后程序不会执行,如果函数异常点之后执行了某些必要动作比如释放某些资源,则这些动作不会执行,会造成诸如资源泄漏问题...在函数面对异常时,请记住: (1)假如函数抛出异常,那么你系统将变得非常危险,也许很长时间什么错误也不会发生;但也许你系统有时就会莫名奇妙地崩溃而退出了,而且什么迹象也没有,不利于系统错误排查...如果函数发生异常,不要让异常逃离析函数函数应该捕捉任何异常,不传播或结束程序; (3)如果客户需要对某个操作函数运行期间抛出异常作出反应,那么class应该提供一个普通函数(而非在函数

1.2K40

是否能在构造函数函数抛出异常

首先是函数。 一.  函数      参照《Effective C++条款08:别让异常逃离析函数。    总结如下:      1. 不要在函数抛出异常!...虽然C++并不禁止函数抛出异常,但这样会导致程序过早结束或出现不明确行为。      2. 如果某个操作可能会抛出异常,class应提供一个普通函数(而非函数),来执行该操作。...构造函数抛出异常,会导致函数不能被调用,但对象本身已申请到内存资源会被系统释放(已申请到资源内部成员变量会被系统依次逆序调用其函数)。      2....因为函数不能被调用,所以可能会造成内存泄露或系统资源未被释放。      3. 构造函数可以抛出异常,但必须保证在构造函数抛出异常之前,把系统资源释放掉,防止内存泄露。(如何保证???...构造函数尽量不要抛出异常,能避免就避免,如果必须,要考虑不要内存泄露! 2. 不要在函数抛出异常! 本文参考: 1. 《Effective C++》条款08:别让异常逃离析函数。 2.

3.6K50

C++构造函数函数抛出异常注意事项

语法上来说,构造函数函数可以抛出异常。但从逻辑上和风险控制上,构造函数函数尽量不要抛出异常,万不得已,一定要注意防止资源泄露。在函数抛出异常还要注意栈展开带来程序崩溃。...1.构造函数抛出异常C++构造函数,既需要分配内存,又需要抛出异常时要特别注意防止内存泄露情况发生。...由于在类B构造函数抛出异常,而此异常并未在构造函数中被捕捉,所以导致类B构造函数执行中断,对象b并未构造完成。在类B构造函数“回滚”过程,c函数和类A函数相继被调用。...最后,由于b并没有被成功构造,所以main()函数结束时,并不会调用b函数,也就很容易造成内存泄露。 2.函数抛出异常函数可以抛出异常,但是这样做很危险,请尽量不要这要做。...} } 在面对函数抛出异常时,程序猿要注意以下几点: (1)C++函数执行不应该抛出异常; (2)假如函数抛出异常,那么你系统将变得非常危险,也许很长时间什么错误也不会发生

2K10

Python函数

人总是在反省中进步! 大家好!我是你们老朋友Java学术趴。函数(destructor) 与构造函数相反,当对象结束其生命周期,如对象所在函数已调用完毕时,系统自动执行函数。...函数往往用来做“清理善后” 工作(例如在建立对象时用new开辟了一片内存空间,delete会自动调用函数后释放内存)。...第十二章 方法12.1 方法解释当一个对象被删除或者被销毁时,python解析器也会默认调用一个方法,这个方法就是 _ del_()方法,也称为方法。对象被删除和销毁时间。...cat = Animal('花花', '3', '虎斑')del cat复制代码方法总结当整个程序脚本执行完毕之后自动调用_ _del__方法当对象被手动销毁时也会自动调用_ _del__方法函数一般用于资源回收...,利用_ _del__方法销毁对象回收内存资源函数就是python进行垃圾回收机制

1.2K30

多态函数

为什么函数要声明成virtual呢? 因为,如果delete一个基类指针时, 如果它指向是一个子类对象,那么函数不为虚就会导致无法调用子类函数,从而导致资源泄露。...函数缺省声明为virtual,就可以避免这一问题。...如果一个类不会被继承,比如一个utility类,该类完全是静态方法; 或者一些类尽管可能会被继承,但不会被使用成多态,即除了函数外,没有其他方法是virtual,这时就可以把virtual属性去掉...去掉函数virtual属性后,因为该类没有其他virtual函数,所以编译时不会生成v-table,这样就节省了编译时间,并减少了最终生成程序大小。...如果是,则调用: delete this; 因为Release()是virtual,所以该COM对象对应正确派生类被调用,delete this会调用正确函数,达到了使用virtual函数效果

75760

C++:39---继承构造函数函数关系

与继承构造父类构造函数相类似: 如果类定义对象没有构造函数,则该类初始化时不需要构造该对象构造函数 如果类定义对象有构造函数,则该类初始化自己构造函数时,要先初始化该对象构造函数 总结...{ b_data = data; } ~B() {} }; 三、继承父、子类构造函数函数执行顺序 构造函数执行顺序: 第一步:先构造父类构造函数 第二步:如果类定义了其他类对象,再初始化其他类构造函数...第三步:最后初始化自己构造函数 函数执行顺序: 与构造函数执行顺序相反 第一步:先执行自己函数 第二步:如果类定义了其他类对象,再执行其他类函数 第三步:最后执行父类函数...但子对象必须在成员初始化列表进行初始化 四、单继承构造函数函数执行顺序 下面代码: 构造函数执行顺序为:2-1-3 函数执行顺序为:6-4-5 //单继承 class M { int m_data...、函数执行顺序 下面代码: 构造函数执行顺序为:1-2-3 函数执行顺序为:6-5-4 //多继承 class A { int a_data; public: A(int data) { a_data

98720

C++不要在构造函数函数调用虚函数

虽然可以对虚函数进行实调用,但程序员编写虚函数本意应该是实现动态联编。在构造函数调用虚函数函数入口地址是在编译时静态确定,并未实现虚调用。...2.不要在函数调用虚函数原因 同样,在函数调用虚函数函数入口地址也是在编译时静态决定。也就是说,实现是实调用而非虚调用。 考察如下例子。...b退出作用域时,会先调用类B函数,然后调用类A函数,在函数~A(),调用了虚函数show()。...输出结果来看,类A函数对show()调用并没有发生虚调用。...概念上说,函数是用来销毁一个对象,在销毁一个对象时,先调用该对象所属类函数,然后再调用其基类函数,所以,在调用基类函数时,派生类对象“善后”工作已经完成了,这个时候再调用在派生类定义函数版本已经没有意义了

2.8K30

C++】继承 ⑦ ( 继承对象模型分析 | 继承构造函数函数 )

int 类型空间 ; 3、问题引入 - 派生类对象构造函数函数调用 上述 继承 过程 , 每一层继承 , 都继承了上一级 父类 成员变量 , 同时自己也定义了新成员变量 ; 在 派生类对象...---- 1、子类构造函数函数调用顺序 继承构造函数函数 : 子类构造 : 子类对象 进行 构造 时 , 需要调用 父类 构造函数 对 继承自父类 成员变量 进行 初始化 操作...进行 时 , 需要调用 父类 函数 对 继承自父类 成员变量 进行 操作 ; 函数调 用顺序如下 : 时 , 先 调用 子类 函数 , 子类 自己成员...; 然后 , 再调用 父类 函数 , 继承自父类成员 ; 2、子类构造函数参数列表 如果 父类 构造函数 有 参数 , 则 需要再 子类 初始化列表 显示调用 该有参构造函数...如果继承 A 类 , 如果 A 类有默认构造函数 , B 类构造函数可以这么写 , 不显式调用 A 类构造函数 , 默认调用 A 类 无参 默认构造函数 ; class B : public

20140

Java函数”——finalize() 对象消亡时调用

这些特性之一就是函数。取代使用函数,Java 支持finalize() 方法。   在本文中,我们将描述 finalize() 与 C++ 函数区别。...因为这一双重支持,C++ 也提供了自动构造和,这导致了对构造函数函数调用,(对于堆对象)就是内存分配和释放。   在 Java ,所有对象都驻留在堆内存,因此局部对象就不存在。...结果,Java 设计者觉得不需要函数(象 C++ 中所实现)。   取而代之,Java 定义了一个特殊方法叫做finalize() ,它提供了 C++ 函数一些功能。...不象 C++ 函数,Java Applet 不会自动执行你finalize() 方法。...Java是没有函数C++函数是在对象消亡时运行。由于C++没有垃圾回收,对象空间手动回收,所以一旦对象用不到时,程序员就应当把它delete()掉。

2.9K10

C++之继承构造和学习总结

在我们前面学习过类构造函数,以及函数,那么自然而然,在继承关系,必然是存在着和构造着。 一、子类对象构造 1、问题引出 如何初始化父类成员? 父类构造函数和子类构造函数有什么关系?...2、子类构造函数怎样初始化父类成员: 子类也是可以定义构造函数: --必须对继承而来成员进行初始化,那么怎样初始化呢?...,就隐式调用父类构造函数;当然上面也使用了显示调用,通过初始列表可以看出。...二、子类对象 1、函数调用顺序与构造函数相反 (1)执行自身函数 (2)执行成员变量函数 (3)执行父类函数 代码实践: #include #include...先执行父类构造函数然后执行成员构造函数 父类构造函数显示调用需要在初始化列表中进行 子类对象在销毁时需要调用父类函数进行清理 顺序与构造顺序对称相反 好了,今天分享就到这里,如果文章中有错误或者不理解地方

34420

C++继承对象模型与继承构造和顺序

继承对象模型 问题:从父类继承过来成员,哪些属于子类对象?...,只是由编译器给隐藏后访问不到 继承构造和顺序 子类继承父类后,当创建子类对象,也会调用父类构造函数 问题:父类和子类构造和顺序是谁先谁后?...<< endl; } ~Son() { cout << "Son函数!"...<< endl; } }; void test01() { //继承 先调用父类构造函数,再调用子类构造函数顺序与构造相反 Son s; } int main() { test01...(); system("pause"); return 0; } 速记:构造时现有父亲后又儿子,顺序相反(白发送黑发) 总结:继承 先调用父类构造函数,再调用子类构造函数顺序与构造相反

56920

C++核心准则C.82:不要在构造函数函数调用虚函数

C.82: Don't call virtual functions in constructors and destructors C.82:不要在构造函数函数调用虚函数 Reason...到目前为止,被调用函数应该只属于构造对象本身,而不是可能存在于派生类某个覆盖函数。那样做非常难理解。...最坏情况,在构造函数或者函数中直接或间接调用一个没有实现纯虚函数会导致没有定义行为。...构造函数函数调用虚函数并不是本身有什么错误。这种调用语义是安全。然而,经验表明这样调用很少是必须,很容易扰乱维护者,如果被新手使用会成为错误源。...提示来自构造函数函数函数调用。

74950

C++:51---继承构造函数函数、拷贝控制一系列规则

一、继承构造函数 根据构造函数执行流程我们知道: 派生类定义时,先执行基类构造函数,再执行派生类构造函数 拷贝构造函数与上面是相同原理 二、继承函数 根据函数执行流程我们知道:...派生类释放时,先执行派生类函数,再执行基类函数 二、继承中被删除函数语法 基类或派生类可以将其构造函数或者拷贝控制成员定义为删除。...规则如下: 如果基类默认构造函数、拷贝构造函数、拷贝赋值运算符、或函数是被删除或者是不可访问,则派生类对应成员将是删除,原因是编译器不能使用基类成员来执行派生类对象属于基类部分操作...} }; 五、特别注意:在构造函数函数调用虚函数 根据构造函数函数我们知道: 派生类构造时,先构造基类部分,然后再构造派生类部分 派生类时,先派生类部分,然后再基类部分 因此...: 在基类构造函数执行时候,派生类部分是未定义状态 在基类函数执行时候,派生类部分已经被释放了 所以在基类构造函数函数调用虚函数是不建议,因为: 虚函数在执行时候可能会调用到属于派生类成员

1.3K30

C++入门到精通——类6个默认成员函数函数

函数 前言 一、函数概念 二、函数特性 三、函数练习题 四、总结 前言 类6个默认成员函数:如果一个类什么成员都没有,简称为空类。 空类真的什么都没有吗?...在C++函数是一种特殊成员函数,用于在对象被销毁时清理其使用资源。它名称与类名称相同,前面加上一个波浪线(~),没有返回类型,也不接受任何参数。...注意:函数不能重载 对象生命周期结束时,C++编译系统系统自动调用函数。...Time 类函数,即当Date对象销毁时,要保证其内部每个自定义对象都可以正确销毁 main函数并没有直接调用Time类函数,而是显式调用编译器为Date类生成默认函数 注意:创建哪个类对象则调用该类函数...,销毁那个类对象则调用该类函数 如果类没有申请资源时,函数可以不写,直接使用编译器生成默认函数,比如Date类;有资源申请时,一定要写,否则会造成资源泄漏,比如Stack类。

23410

C++入门到精通第二弹——类构造与函数

写在最前面的话 ——构造函数函数是两个特殊成员函数,都没有返回值,构造函数名和类名相同,函数名只是在类名前加上 ~ 构造函数主要用来在创建对象时给对象数据成员赋值,主要目的是初始化对象..., 函数功能与构造函数正好相反,函数是用来释放对象,再删出对象前,对对象进行清理工作。...函数不能发生重载 不管是构造函数还是函数都不能使用return语句,没有返回值 在不同环境下构造函数函数调用规则如下: 自动变量作用域是某个模块,当此模块被激活时,调用构造函数,...全局变量在进入main函数之前调用构造函数,在程序终止时调用函数。 动态分配对象在使用new为对象分配内存时调用构造函数,使用delete删除对象时调用函数。...临时变量是编译器为支持计算自动产生,临时变量生存期开始和结束点会调用构造函数函数

11540

构造函数以及函数在PHP需要注意地方

构造函数以及函数在PHP需要注意地方 基本上所有的编程语言在类中都会有构造函数函数概念。...构造函数是在函数实例创建时可以用来做一些初始化工作,而函数可以在实例销毁前做一些清理工作。...,则默认调用父类 函数如果没显式地将变量置为NULL或者使用unset()的话,会在脚本执行完成后进行调用,调用顺序在测试代码是类似于栈形式先进后出(C->B->A,C先被),但在服务器环境则不一定...,也就是说顺序不一定固定 函数引用问题 当对象包含自身相互引用时,想要通过设置为NULL或者unset()来调用函数可能会出现问题。...构造函数函数访问限制 构造函数函数默认都是public,和类其他方法默认值一样。当然它们也可以设置成private和protected。

1.6K20

C++函数多态实现原理刨

多态实现原理刨函数关键字:virtual 未写virtual关键字前: #include using namespace std; class Animal { public...区别: 代码本意是调用猫类里面的speak函数,但是未在父类speak函数前加virtual关键字时,调用是父类speak函数,加了virtual关键字后,调用是猫类里面的speak函数,这就是多态...在深入探究多态实现原理前,先要理解多态意思和虚函数实现条件 多态: 不同类对象对同一消息不同响应 注意: 虚函数实现条件 : 1.有继承关系 2.子类重写父类函数 动态多态使用...未写虚函数前,空对象a大小为1,写了虚函数后,对象a大小为4,是因为此时a里面存放了一个vfptr虚函数(表)指针,指针大小无论类型均为4个字节大小 该虚函数指针指向一个虚函数表 当子类未重写父类虚函数时...当发生虚函数重写时,子类会把自己函数覆盖掉之前父类函数 因此当父类指针或者引用指向子类对象时候,会发生多态,你传入是cat对象,就去cat函数找speak函数入口地址

44510
领券