异常-不正确的行为在vc++ 2015 CTP终极
Exceptions- incorrect behaviour in VC++2015 CTP Ultimate
我有一个程序:
#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
在他的问题
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- 参考资源文件VC++中的$(SolutionDir)
- VC++本机单元测试,找不到调试符号
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- 从VS 2015更新3更新到VS2015更新3 d后浮点计算行为不同的原因
- 在Visual Studio 2017上使用VC++ 2015工具链时缺少ATL标头
- 使用Visual Studio 2015社区版为应用程序制作安装程序,其中集成了VC++ 2015环境
- 使用 std::bitset 时程序崩溃,但仅在使用 VC 2015 编译时崩溃
- VC 2015 U3-断言崩溃了应用程序
- 无法创建或打开 *.VS 2015 中的 VC.db 文件(桌面快速版)更新 3RC
- VC++ Redistributable 2012 or 2013 or 2015?
- VC++编译器升级2010->2015重新定义; 'constexpr'说明符不匹配
- 为什么不编译?(VC++ 2015,#pragma omp flush)
- 如何在使用Visual Studio 2015时使用MSI分发VC redist
- 奇怪的错误 C2131:表达式在 VC 2015 中未计算为常量
- 如何在VC++2015全程序优化的情况下正确地从dll中公开接口
- VC++14.0(2015)编译器中的错误
- 异常-不正确的行为在vc++ 2015 CTP终极
- 在Visual Studio 2015中使用Npcap编译VC++程序
- VC++ 2015 没有链接,但 VC++ 2012 有链接