抛出导致析构函数被调用的异常会导致程序崩溃

时间:2018-01-19 07:07:00

标签: c++ exception exception-handling

考虑这段小代码,它实际上是更大代码库的一部分:

.htaccess

对于我的特定情况,输出结果是

class A
{
public:
    A()
    {
        std::cout << "A" << std::endl;
    }

    ~A()
    {
        std::cout << "~A" << std::endl;
    }
};

void f()
{
    A a;
    throw;
}

void g()
{
    try
    {
        f();
    }
    catch(...)
    {
        std::cout << "Caught" << std::endl;
    }
}

似乎不是被捕获的异常,程序才被终止。但是,如果我删除了A的构造函数,则 会被捕获。

如果不仔细分析代码,是否有可能知道是什么导致了这种行为?

1 个答案:

答案 0 :(得分:14)

没有操作数的 throw-expression ,如代码所示:

  • 重新排列当前处理的异常(同一个对象,而不是它的副本)
  • 或者,如果当前没有处理的例外,请拨打std::terminate

我假设在处理异常时f() 而不是被调用(我想你直​​接从main或其他东西调用它)。因此,std::terminate被称为。{/ p>

对象a无关紧要。