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

我应该将throw()添加到我的C++析构函数的声明中吗?

在C++中,析构函数不应该抛出异常。在C++的设计中,析构函数的主要目的是确保对象在销毁时释放其资源,因此它们应该尽可能地简单和可靠。如果析构函数抛出异常,可能会导致程序的行为不可预测,因为在析构函数抛出异常时,程序可能已经处于异常状态。

因此,在C++中,析构函数应该避免抛出异常。如果析构函数需要执行可能抛出异常的操作,应该使用try-catch语句来捕获和处理异常,以确保析构函数的正常执行。

总之,在C++中,析构函数不应该声明为throw(),因为这可能会导致程序的行为不可预测。相反,应该使用try-catch语句来处理可能抛出异常的操作。

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

相关·内容

C++核心准则C.127:包含虚函数应该有虚函数或保护函数

C.127: A class with a virtual function should have a virtual or protected destructor C.127:包含虚函数应该有虚函数或保护函数‍...包含虚函数类通常(大多数情况下)通过指向基类指针使用。通常,最后一个使用者必须通过指向基类指针调用delete操作,通常是指向基类智能指针,因此函数应该是公开函数。...稍微特殊一些情况是:如果不希望支持通过指向基类指针销毁对象,函数应该是保护非虚函数。参见C.35。...包含虚函数函数要么是公开函数,要么是保护非虚函数。...提示针对包含虚函数却没有虚函数销毁操作。

74720

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

98020

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

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

2K10

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

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

19640

C++】泛型编程 ⑬ ( 类模板示例 - 数组类模板 | 构造函数函数 声明与实现 | 普通成员函数 声明与实现 | 外部友元函数 声明与实现 )

{ private: // 数组长度 int m_length; // 指向数组数据内存 指针 // 指针类型 是 泛型类型 T T* m_space; }; 2、构造函数函数 ...声明与实现 在声明类时 , 前面加上 模板类型声明 template , 说明在类要使用类型 T ; 在 Array 类 , 声明 构造函数 , 拷贝构造函数 , 函数..., 不需要 显示注明 类型 T ; 声明 构造函数 , 拷贝构造函数 , 函数 : template class Array { public: // 有参构造函数...函数 : 在 类模板 外部 访问 类模板 声明 函数 , 先显示声明 模板类型 template , 然后在下面使用 域作用符 访问 类模板 函数 , 域作用符...cout << " 调用函数 " << endl; } 3、普通成员函数 声明与实现 重载 数组下标 [] 操作符 , 使用 类模板内部 成员函数即可完成 ; 普通成员函数 声明 : 数组下标

38110

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

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

1.2K30

C++ 异常机制分析

如果catch参数是传值,则复制函数依据异常对象来构造catch参数对象。在该catch语句结束时候,先catch参数对象,然后再异常对象。...我们知道,在函数调用结束时,函数局部变量会被系统自动销毁,类似的,throw可能会导致调用链上语句块提前退出,此时,语句块局部变量按照构成生成顺序逆序,依次调用函数进行对象销毁。...更重要是,构造函数抛出异常表明构造函数还没有执行完,其对应函数不会自动被调用,因此函数应该所有所有已初始化基对象,成员对象,再抛出异常。...& err ) { /* 构造函数异常处理部分 */ }; 异常机制与函数 C++不禁止函数向外界抛出异常,但函数被期望不向外界函数抛出异常。...函数函数外抛出异常,直接调用terminator()系统函数终止程序。如果一个函数内部抛出了异常,就应该函数内部捕获并处理该异常,不能让异常被抛出函数之外。

1.7K61

C++核心准则​讨论:基类函数设为公共和虚拟,或受保护和非虚拟

函数应该是虚函数?也就是说,是否应该允许通过指向基类指针进行销毁?如果是,则base函数必须是公共才能被调用,否则虚拟调用它会导致未定义行为。...否则,应该对其进行保护,以便只有派生类才能在自己函数调用它,这个函数应该是非虚,因为它不需要虚拟地运行。...这种情况导致较早编码标准对所有基类函数都必须是虚拟提出了全面的要求。这太过分了(即使是常见情况);相反,规则应该是当且仅当基类函数是公共时,才将它们虚函数化。...然后,即使函数必须是公共,也可能会面临很大,不将其虚函数压力,因为作为第一个虚拟函数,当永远不需要添加功能时,它将招致所有运行时类型开销。...在这种罕见情况下,您可以函数设为公共和非虚拟,但要清楚地表明,不允许衍生出对象用作B多态形式。这正是std :: unary_function功能。

1.1K20

控制对象创建方式(禁止创建栈对象or堆对象)和创建数量

我们知道,C++内存划分为三个逻辑区域:堆、栈和静态存储区。既然如此,称位于它们之中对象分别为堆对象,栈对象以及静态对象。通常情况下,对象创建在堆上还是在栈上,创建多少个,这都是没有限制。...可以构造函数函数设为私有的,这样系统就不能调用构造/函数了,当然就不能在栈中生成对象了。...所以,如果构造函数函数声明为private会带来较大副作用,最好方法是函数声明为private,而构造函数保持为public。...再进一步,函数设为private除了会限制栈对象生成外,还有其它影响?是的,这还会限制继承。如果一个类不打算作为基类,通常采用方案就是将其函数声明为private。...为了限制栈对象,却不限制继承,我们可以函数声明为protected,这样就两全其美了。

1.9K20

闭关多日,整理一份C++那些重要又容易忽视细节

运算符重载 面试题:C++类自动提供成员函数 虚基类为什么需要虚函数?...直接来个示例看一下吧: class test{ public: virtual ~test() = 0; // 声明一个纯虚函数 }; 防止内存泄露,定义一个基类指针p,在delete p时,如果基类函数是虚函数...,这时只会看p所赋值对象,如果p赋值对象是派生类对象,就会调用派生类函数(毫无疑问,在这之前也会先调用基类构造函数,在调用派生类构造函数,然后调用派生类函数,基类函数,所谓先构造后释放...如果派生类定义了新函数,则该函数也将被添加到vtbl。注意,无论类包含函数是1个还是10个,都只需要在对象添加1个地址成员,只是表大小不同而已。...调用虚函数时,程序查看存储在对象vtbl地址,然后转向相应函数地址表。如果使用类声明定义第一个虚函数,则程序将使用数组第一个函数地址,并执行具有该地址函数

57710

C++异常实现与longjmp, setjmp,栈指针EBP, Active Record

要负责两件事情:(1)完成跳转;(2)恢复堆栈AR;try则负责保存当前AR  4 不要在C++中使用setjmp和longjmp   因为,longjmp时候,不保证局部对象函数调用。   ...longjmp()跳转前局部对象可能并不会(g++),也可能(VC++),C++标准对此并无明确要求。这种依赖于具体编译器版本代码是应该避免。   ...而C++本身throw关键字,却能严格保证局部对象构造和成对调用。   ...有趣是C++11在标准删除了异常规范,而且添加了 noexcept关键字来声明一个函数不会抛出异常,可见异常并不是那么受欢迎。   ...然而,C++STL广泛使用异常,所以实际上使用了STLC++程序是不可能禁用异常,要是没有了STL,C++又有什么优势了呢?C++在不断矛盾冲突向前发展者。

47800

学过 C++ 你,不得不知这 10 条细节!

赋值之后 p.m_Name 应该指向 s.m_Name 所指那个 string ?也就是说引用自身可被改动?如果是,那就开辟了新天地,因为 C++ 并不允许「让引用更改指向不同对象」。...---- 细节 06:为多态基类声明 virtual 函数 多态特性基础内容,可移步到我旧文进行学习 --> 掌握了多态特性,写英雄联盟代码更少啦!...因此,无端地所有类函数声明为 virtual ,是错误,原因是会增加不必要体积。...---- 细节 06 小结 - 请记住 在多态性质基类,应该声明一个 virtual 函数。如果 class 带有任何 virtual 函数,它就应该拥有一个 virtual 函数。...不要尝试以某个 copying 函数实现另外一个 coping 函数应该共同地方放进第三个函数,并由两个 copying 函数共同调用。

70720

C++ 初阶 类和对象()

,test并没有创建属于它函数,但它自己就去调用了它自定义类型成员默认构造函数,使得对应数据被初始化。...有细心同学可以发现,a也被初始化了,它不应该是随机值?...讲完了构造函数,那么我们就来讲一下函数,既然构造函数是令类创建时候初始化,那么函数则是在类生命域结束时候目标清理,也就是destroy,比方说,我们写了一个顺序表,它malloc了一大块空间...因此在C++,就诞生了一个函数,它就是函数,它能够令对应类出了它生命域便销毁,从而保证了安全性。 2.函数特性 1. 函数名是在类名前加上字符 ~。 2....一若未显式定义,系统会自动生成默认函数。注意:函数不能重载 4. 对象生命周期结束时,C++编译系统系统自动调用函数

13110

《逆袭进大厂》之C++篇49问49答(绝对干货)

注意 模板及其特例化版本应该声明在同一个头文件,且所有同名模板声明应该放在前面,后面放特例化版本。...所以函数声明为虚函数是十分必要。在实现多态时,当用基类操作派生类,在时防止只基类而不派生类状况发生,要将基类函数声明为虚函数。...40、构造函数函数、虚函数可否声明为内联函数 首先,这些函数声明为内联函数,在语法上没有错误。因为inline同register一样,只是个建议,编译器并不一定真正内联。...《Effective C++》中所阐述是:构造函数函数声明为inline是没有什么意义,即编译器并不真正对声明为inline构造和函数进行内联操作,因为编译器会在构造和函数添加额外操作...其次,class函数默认是inline型,编译器也只是有选择性inline,构造函数函数声明为内联函数是没有什么意义

2.5K40

《逆袭进大厂》之C++篇49问49答

注意 模板及其特例化版本应该声明在同一个头文件,且所有同名模板声明应该放在前面,后面放特例化版本。...所以函数声明为虚函数是十分必要。在实现多态时,当用基类操作派生类,在时防止只基类而不派生类状况发生,要将基类函数声明为虚函数。...40、构造函数函数、虚函数可否声明为内联函数 首先,这些函数声明为内联函数,在语法上没有错误。因为inline同register一样,只是个建议,编译器并不一定真正内联。...《Effective C++》中所阐述是:构造函数函数声明为inline是没有什么意义,即编译器并不真正对声明为inline构造和函数进行内联操作,因为编译器会在构造和函数添加额外操作...其次,class函数默认是inline型,编译器也只是有选择性inline,构造函数函数声明为内联函数是没有什么意义

1.9K10

《C++Primer》第十八章 用于大型程序工具

1.3 函数与异常 函数总是会被执行,但是函数负责释放资源代码 却可能被跳过。 如果一个块分配了资源,并且在负责释放这些资源代码前面发生了异常,则释放资源代码不会被执行。...因此我们使用类来控制资源分配,就能确保无论函数正常结束还是遭遇异常,资源都能被正常释放。 由于栈展开可能使用函数,因此函数应该抛出不能被它自身处理异常。...换句话说,如果函数需要执行某个可能正常抛出异常操作,则该操作也应该被放置在一个try语句块当中,并且在函数内部得到处理。...(在实际编程过程,因为函数仅仅是释放资源,所有他不太可能抛出异常,所有标准库类型都能确保它们函数不会抛出异常)。 在栈展开过程,运行类类型局部对象函数。...因为这些函数是自动执行,所以它们不应该抛出异常。一旦在栈展开过程函数抛出了异常,并且函数自身没能捕获到该异常,则程序被终止。

1.3K20

工作中常见几种内存泄漏场景汇总

进程退出,异常信息如下图所示: 从结果可以看出,抛出异常后代码退出,但是类函数没有被调用。这也说明如果在构造函数抛出异常,类函数是不会被调用。...3、基类函数引发内存泄露 在C++,如果子类对象是通过基类指针进行删除,如果基类函数不是虚拟,那么子类函数可能不会被调用,从而导致派生类资源没有被释放,进而产生内存泄漏。...这是因为,在基类并没有定义函数,在这种情况下,编译器会为我们默认生成一个函数,但还不够智能,生成函数不是虚拟,这样在对基类指针进行时就不能调用子类函数释放资源。...如果想要达到我们想要效果,只需将基类函数定义成虚即可。修改后运行结果如图所示: 可见,子类资源得到正常释放。...但是这样做就破坏了delete工作原理,delete删除对象时,先调用对象函数,再delete指针对象,上面的代码在pBase转换成void*后,delete获取不到对象类型就不能正确调用对象函数

93920

关于C++异常,你必须知道

不要使用抛出异常作为从函数返回结果另一种方式使用。 使用异常时应防止资源泄露 资源泄露通常都是不可接受。如果只是简单去掉原有的错误处理代码并增加异常抛出和处理代码,通常会发生资源泄露。...因为某段代码有不会抛出异常操作构成,所以我们知道某函数不会抛出异常。通过函数定义为noexcept,向编译器和代码读者传递了可以让它们更容易理解和维护信息。...很多标准库函数被定义为noexcept,包含所有从C标准库继承标准库函数。 但应该注意是,一旦定义了noexcept,C++编译器就会放弃为函数生成接受、转发异常处理。...函数,内存释放和swap操作永远不能失败 如果函数、swap操作或者内存释放失败了,我们不知道如何编写可信赖处理程序;也就是说,如果它因为异常退出或者只是没有执行要求操作。...标准库假设函数,内存释放函数(例如delete运算符),swap都不会抛出异常。如果它们异常,标准库前提条件就被破坏了。

57241

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券