我有一个程序:
#include<iostream>
using namespace std;
class Test
{
public:
void func()
{
cout << "Inside func" << endl;
throw;
}
};
int myfunc()
{
Test T;
T.func();
return 1;
}
int main()
{
myfunc();
cout << "Main func" << endl;//should not print
getchar();
}
我的期望是这个程序将从main
终止,但在vc++ 2015上main
cout
正在打印。这违背了我的理解,所以我用gcc
编译它,它在那里工作得很好。
这是vc++ 2015中的错误还是像这样的程序终止行为是未指定的/UB行为?它应该执行cout << "Main func" << endl;
吗?
IDE: VS2015 CTP终极预览版(30天)
flags: /GS /analyze- /W3 /Zc:wchar_t /ZI /Gm /Od /sdl /Fd"Debugvc140.pdb" /fp:precise /D "_MBCS" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /Oy- /MDd /Fa"Debug" /EHsc /nologo /Fo"Debug" /Fp"Debugexception.pch"
不带参数的throw
,当在不适当的上下文中调用时,应该调用terminate
。
按标准:
没有操作数的throw-expression将重新抛出当前处理的异常
…
如果当前没有处理异常,执行一个没有操作数的抛出表达式调用
std::terminate()
那么行为取决于当前安装的std::terminate_handler
,但无论如何执行应该被终止。
要求行为:
terminate_handler
应终止程序的执行而不返回给来电者。默认行为:实现默认的
terminate_handler
调用abort
。默认实现调用std::abort
。
我猜你是在VS调试环境中运行测试程序。尝试在发布版本中编译程序并通过单击可执行文件来运行它。将弹出异常错误框,并且不会打印"Main函数"。事实上,VS调试器中的行为是一个特性而不是一个bug。
微软在这里声明:
在Visual Studio中,当抛出异常或最终未处理异常时调试器可以通过中断来帮助您调试这些错误,就像它在遇到断点
此时,开发人员可以排除问题,或者继续执行将导致海报看到的行为,即印刷main func
在他的问题