为什么您不能从析构函数中抛出。例子

朦胧的

我已经读到,由于堆栈展开,从析构函数中抛出不是一个好主意。我不确定我是否完全理解。所以我尝试了以下示例

struct foo
{
    ~foo()
    {
        throw 1;
    }
};


struct bar
{
    ~bar()
    {
        throw 2;
    }
};

int main()
{
    try 
    {
        foo a;
        bar b;
        throw 3;
    }catch(int a)
    {
        std::cout << a;
    }
}

现在我期望a为1,因为首先抛出3,然后调用b的析构函数并抛出2,然后调用a的析构函数并抛出1。从破坏者身上抛出的想法。我的问题是为什么为什么要调用abort()的b的析构函数?

马克·兰索姆

只要在进行异常处理时抛出异常,就会收到无法捕获的特殊异常,这将导致异常中止。

您可以std::uncaught_exception用来检测异常处理是否已经在进行中,并避免在这种情况下抛出异常。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么C ++不使用std :: nested_exception允许从析构函数中抛出?

为什么不能使用析构函数进行类化

为什么不能将析构函数标记为constexpr?

为什么在Friend函数中调用析构函数

从析构函数中抛出异常

为什么不在析构函数中关闭串行端口?

为什么析构函数挂起

为什么要调用析构函数

为什么不调用析构函数?

为什么在插入析构函数时总是得到“在抛出...实例后终止调用”?

为什么我无法处理从析构函数外部抛出的异常?

为什么在抛出我的析构函数时没有调用 std::terminate

为什么不能在析构函数可以的同时显式调用构造函数?

为什么`std :: exit`不能按预期触发析构函数?

为什么不能分配带有已删除或私有析构函数的类的数组?

为什么带有析构函数的类不能简单地移动构造?

在OpenCV中,什么是VideoCapture析构函数

析构函数中的析构函数?

从析构函数中抛出异常对于vtable是安全的吗?

为什么不能从函数中获取Pandas细胞的类型?

为什么我不能从C中的函数传回链表?

为什么“ = default”析构函数与隐式声明的析构函数不同?

为什么在g ++产生的汇编代码中这样定义构造函数/析构函数?

为什么析构函数比构造函数调用得更多?

为什么Java Android中的super.onDestroy()在析构函数中处于首位?

在派生类构造函数中引发异常。为什么调用基类析构函数而不是派生类析构函数?

为什么要为C ++中的抽象类声明虚拟析构函数?

为什么我们需要C ++中的纯虚拟析构函数?

为什么在VC中,“ delete”和“ delete []”都使用标量删除析构函数?