C++ 程序以“结束”;abort()已被调用;VS2017上的错误

C++ 程序以“结束”;abort()已被调用;VS2017上的错误,c++,c++11,visual-studio-2012,visual-studio-2017,c++14,C++,C++11,Visual Studio 2012,Visual Studio 2017,C++14,下面的代码通过给出错误退出 “已调用abort() 这是由于析构函数引发异常造成的吗?我知道从析构函数抛出异常会导致未定义的行为,但也有反参数。此外,同样的程序在VS 2012中也能正常运行 #include "stdafx.h" #include<iostream> using namespace std; class Txn { public: Txn() { cout<< "in Constructor" << en

下面的代码通过给出错误退出

“已调用abort()

这是由于析构函数引发异常造成的吗?我知道从析构函数抛出异常会导致未定义的行为,但也有反参数。此外,同样的程序在VS 2012中也能正常运行

#include "stdafx.h"
#include<iostream>
using namespace std;
class Txn
{
 public:
     Txn()
     {
        cout<< "in Constructor" << endl;
     };

    ~Txn()
    {
        try
        {
            cout << "in destructor" << endl;
            throw 10;
        }
        catch(int i)
        {
            cout << "in destructor exception" << endl;
            throw;
        }
    }
};

int main()
{
    try
    {
        Txn t;
    }
    catch (int i)
    {
        cout << "Exception" << i << endl;
    }
    return 0;
}
#包括“stdafx.h”
#包括
使用名称空间std;
类Txn
{
公众:
Txn()
{

cout未定义的行为可以是任何行为,包括对abort()的调用;只要避免任何可能导致它的行为即可


从析构函数抛出是不被禁止的,但是在try/catch中这样做可能会导致抛出双重异常。

未定义的行为可以是任何行为,包括对abort()的调用;只要避免任何可能导致它的行为即可


从析构函数抛出是不被禁止的,但是在try/catch中这样做可能会导致抛出双重异常。

默认情况下,析构函数不会抛出异常(
noexcept
)。您可以通过添加
noexcept(false)
来告诉编译器此析构函数没有使用默认值

在这个例子中,我们现在从编译器那里得到了一个不同的诊断——析构函数永远不会,永远不会到达终点。析构函数永远不会完全销毁对象是不好的

为了“修复”这个问题,我必须使用
if
来设置重新播放的条件

class Txn
{
 public:
     Txn()
     {
        cout<< "in Constructor" << endl;
     };

    ~Txn() noexcept(false)
    {
        try
        {
            cout << "in destructor" << endl;
            throw 10;
        }
        catch(int i)
        {
            cout << "in destructor exception" << endl;
            if (i == 10) throw;
        }
    }
};
Txn级
{
公众:
Txn()
{

默认情况下,cout析构函数不会抛出异常(
noexcept
)。通过添加
noexcept(false)
,可以告诉编译器此析构函数未使用默认值

在这个例子中,我们现在从编译器那里得到了一个不同的诊断——析构函数永远不会,永远不会到达终点。析构函数永远不会完全销毁对象是不好的

为了“修复”这个问题,我必须使用
if
来设置重新播放的条件

class Txn
{
 public:
     Txn()
     {
        cout<< "in Constructor" << endl;
     };

    ~Txn() noexcept(false)
    {
        try
        {
            cout << "in destructor" << endl;
            throw 10;
        }
        catch(int i)
        {
            cout << "in destructor exception" << endl;
            if (i == 10) throw;
        }
    }
};
Txn级
{
公众:
Txn()
{

cout这里的问题是默认情况下所有析构函数都是
noexcept(true)
。在不更改调用的情况下引发异常将立即调用
std::terminate
。如果我们使用

class Txn
{
 public:
     Txn()
     {
        cout<< "in Constructor" << endl;
     };

    ~Txn() noexcept(false)
    {
        try
        {
            cout << "in destructor" << endl;
            throw 10;
        }
        catch(int i)
        {
            cout << "in destructor exception" << endl;
            throw;
        }
    }
};

int main()
{
    try
    {
        Txn t;
    }
    catch (int i)
    {
        cout << "Exception" << i << endl;
    }
    return 0;
}
Txn级
{
公众:
Txn()
{

cout这里的问题是默认情况下所有析构函数都是
noexcept(true)
。在不更改调用的情况下引发异常将立即调用
std::terminate
。如果我们使用

class Txn
{
 public:
     Txn()
     {
        cout<< "in Constructor" << endl;
     };

    ~Txn() noexcept(false)
    {
        try
        {
            cout << "in destructor" << endl;
            throw 10;
        }
        catch(int i)
        {
            cout << "in destructor exception" << endl;
            throw;
        }
    }
};

int main()
{
    try
    {
        Txn t;
    }
    catch (int i)
    {
        cout << "Exception" << i << endl;
    }
    return 0;
}
Txn级
{
公众:
Txn()
{

从析构函数中抛出异常不会导致不确定的行为。但是,这通常不是一个好的实践。你忽略了编译器的一些警告吗?把警告当作错误。GCC给出了这样的结论:看起来你应该已经得到了。我不明白这个问题的目的,来测试C++标准的半合法的情况吗?W。它解决了什么样的问题?从析构函数引发异常不会导致未定义的行为。但是这通常不是一个好的做法。您是否忽略了来自编译器的一些警告?将警告视为错误。GCC给出了这样一个:看起来您应该得到。请看,我不明白这个问题的目的,即测试“C++的标准是什么?它是什么样的问题?”贾斯廷没有这么说。在编辑之前,它似乎是这样的。无论如何,调用<代码>异常>代码>不是因为UB。@贾斯廷,我没有这么说。在编辑之前,它似乎是这样的。无论如何,调用<代码>异常> <代码>不是由于UB。使用<代码> /ZC:ert返回此问题的C++11之前的行为。使用
/Zc:implicitNoexcept-
返回此问题的C++11之前的行为。