草庐IT

c++ - 为什么我的程序在析构函数抛出异常时终止?

我不明白为什么如果有一个活跃的异常,那么如果再次引发异常,它会导致程序终止。有人可以解释一下吗? 最佳答案 它应该做什么?它不能“双重捕获”或任何东西,简单地忽略一个也没有意义。该标准规定,如果在堆栈展开期间,另一个异常逃逸,则应调用terminate。C++FAQ中有更多讨论.一种“解决方案”是将析构函数代码包装在try/catchblock中,并且不要让异常逃逸。另一个是提出某种自定义异常链接方案。您将执行上述操作,但不是忽略异常,而是将其附加到当前抛出的异常,并在捕获站点手动处理这两个异常。我认为最好的解决方案是尝试从析构函数

c++ - C++ 析构函数的奇怪行为

#include#includeusingnamespacestd;intmain(){vector>dp(50000,vector(4,-1));cout这个小程序只需从命令行运行即可瞬间执行。但是在调试器中运行时,它需要超过8秒。暂停调试器表明它正在销毁所有这些vector。什么鬼?注意-VisualStudio2008SP1、Core2Duo6700CPU和2GBRAM。添加:为了澄清,不,我没有混淆调试和发布版本。这些结果在同一个.exe上,中间甚至没有任何重新编译。事实上,在Debug和Release构建之间切换不会有任何改变。 最佳答案

c++ - 为什么析构函数被调用了三次?

输入:#includeusingnamespacestd;classSimpleClass{public:SimpleClass(){cout输出:SimpleClassConstructorSimpleClassConstructorSimpleClassdestructorSimpleClassdestructorSimpleClassdestructor我很困惑为什么析构函数被调用了3次。构造函数只被调用了两次!!! 最佳答案 析构函数被调用了3次,分别是a、lol和b。在您的例子中,a和b是使用默认构造函数实例化的。但是请注

c++ - 如果失败的析构函数不能抛出异常怎么办

我注意到您不能在析构函数中抛出异常。所以我的问题是如果析构函数失败我该怎么办。另一个问题是,在什么情况下析构函数可能会失败?非常感谢 最佳答案 忽略错误。如果类包装某种输出,并且析构函数刷新并关闭该输出,则析构函数可能“失败”。写入数据可能会失败。然后你的选择是终止程序,或者捕捉异常,忽略错误,然后返回。通常正确的设计是忽略它。在我的示例中,该类还应该有一个“close_and_flush”函数,如果用户想知道它是否成功,可以在对象销毁之前调用该函数。如果你的类的用户不关心操作是否失败,那么你也不关心,你可以安全地抑制异常。用户可以

c++ - 我应该将我的派生类析构函数标记为虚拟/覆盖吗?

C++核心指南包含followingadvice关于virtual、override和final说明符,特别是与派生类析构函数有关:Ifabaseclassdestructorisdeclaredvirtual,oneshouldavoiddeclaringderivedclassdestructorsvirtualoroverride.Somecodebaseandtoolsmightinsistonoverridefordestructors,butthatisnottherecommendationoftheseguidelines.果然,clang-tidy是那些违反推荐的工具

c++ - 为什么 std::shared_ptr 从基类和派生类调用析构函数,而 delete 只调用基类的析构函数?

这个问题在这里已经有了答案:Howisitpossible(ifitis)toimplementshared_ptrwithoutrequiringpolymorphicclassestohavevirtualdestructor?(3个答案)关闭8年前。为什么在使用std::shared_ptr释放时从基类和派生类调用析构函数,而第二个示例仅从基类调用析构函数?classBase{public:~Base(){std::coutsharedA(newDerived);}std::cout输出:--------------------DeriveddestructorBasedestr

c++ - 为什么在定义析构函数时编译器不再添加默认移动构造函数和赋值?

我无法理解自动添加默认ctors背后的基本原理。特别是我觉得很尴尬,每次我只需要添加一个空的虚拟析构函数,仅此而已,我松散了移动的东西,但是添加它们我松散了拷贝和默认的东西,所以我最终添加了所有这些代码块:virtual~SomeClass(){}//youaretheguilty!//virtual~SomeClass()=default//wouldbethesameSomeClass(SomeClass&&)=default;//nomoreauto-addedSomeClass&operator=(SomeClass&&)=default;//nomoreauto-addedS

c++ - 静态变量构造函数/析构函数的异常

您好,我在网络教程中找到了这一行。Whathappenswhenyoudeclareastaticobjectandthedestructorthrowsandexception?Aswithstaticconstructorexceptionstheapplicationwillcrash.我无法理解对象是否是静态的有什么区别...谢谢 最佳答案 我不确定您问的是构造函数还是析构函数会抛出异常-问题陈述指的是析构函数,但示例代码和一些注释指的是构造函数。关于抛出的构造函数,这取决于静态对象是局部的还是全局的。局部静态对象是在第一次

c++ - CRT虚拟析构函数

由于我的dll和我的实际项目中的不同CRT设置(MTdMDd),我今天遇到了堆损坏。我发现奇怪的是,只有当我将dll中的析构函数设置为虚拟时,应用程序才会崩溃。对此有一个简单的解释吗?我知道我无法释放不在我的堆上的内存,但是当我将析构函数定义为非虚拟时,究竟有什么不同。一些代码只是为了让它更清晰一些动态链接库#pragmaonceclassCTestClass{public:_declspec(dllexport)CTestClass(){};_declspec(dllexport)virtual~CTestClass(){};};还有我的项目intmain(intargc,char*

c++ - 使用自定义析构函数时出现 "Undefined reference"错误

我正在尝试编写一个需要释放一些内存的类,因此我定义了一个自定义析构函数。这被编译为共享库。但是,当我尝试编译一个基本程序以使用该库时,当找不到定义时,我会收到常见的“undefinedreference”错误。如果我删除析构函数,则不会发生这种情况。这是一个精简的例子:头文件:#ifndef_SKYMAP_H_#define_SKYMAP_H_#include#include"TCanvas.h"classBL_Skymap{public:BL_Skymap();~BL_Skymap();protected:TCanvasmCanvas;};#endif//_BENSLIBRARY_S