簡體   English   中英

VS2017上的程序結尾為“ abort()has been named”錯誤

[英]Program ends with “abort() has been called” error on VS2017

下面的代碼通過給出錯誤退出

“ 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;
}

VS2017發行說明未提及任何有關異常處理更改的內容。

所以我有以下問題:

  1. 從VS2017開始在析構函數中引發異常是否不正確? 是否總是通過調用abort()退出程序?
  2. 有沒有可以使它起作用的標志?

請提出建議。

這里的問題是默認情況下所有析構函數都是noexcept(true) 在不更改will的情況下引發異常將立即調用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;
}

該程序將按預期運行。


這在VS2012中起作用但在VS2017中不起作用的原因是在C ++ 11之前,析構函數可能會拋出,而無需指定它。 在C ++ 11中, noexcept說明符以及默認情況下所有析構函數均為noexcept的更改導致其在VS2017中中斷。

默認情況下,期望析構noexcept不引發異常( 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;
        }
    }
};

未定義的行為可以是任何東西 ,包括對abort()的調用; 只要避免一切可能引起它的事情。

禁止從析構函數中拋出,但是在try / catch中執行此操作可能會導致拋出雙重異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM