[英]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發行說明未提及任何有關異常處理更改的內容。
所以我有以下問題:
請提出建議。
這里的問題是默認情況下所有析構函數都是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.