[英]C++ Exception “Skips” Try-Catch Clause in MSVC x64
我正在用C ++编写程序。 该程序已经适用于Win32(x86),最近我尝试为x64本地编译它。 当然,东西不能马上工作。
在调试问题后,我设法使用这个简单的代码片段重现它:
class MyException { };
int main()
{
try {
for (;;) {
try {
std::cout << "Throwing" << std::endl;
throw MyException();
if (1 == 0) {
continue;
}
} catch (const MyException&) {
std::cout << "Catch 1" << std::endl;
}
}
} catch (const MyException&) {
std::cout << "Catch 2" << std::endl;
}
std::cout << "Done" << std::endl;
return 0;
}
(我会尽快解释if (1==0)
条款)
使用MSVC for x86编译此代码时(我使用过2010),结果如预期:
Throwing
Catch 1
Throwing
Catch 1
Throwing
Catch 1
Throwing
Catch 1
...
等等,在无限循环中。
但是,为x64编译此代码会导致:
Throwing
Catch 2
Done
该异常完全跳过内部catch子句!
只有在我的代码中存在if (1 ==0)
子句时才会发生这种情况。 当我删除它时,异常会按预期在“Catch 1”中捕获。
我尝试过使用其他编译器:
我的问题:这是一个MSVC错误,还是这个C ++中的一些未定义的行为我错过了? 如果这确实是一个MSVC错误,我很想听听有关原因的一些见解。
谢谢。
这个bug可能与编译器优化有关 - 有趣的是链接器在你的发布版本中崩溃(理论上打开完全优化时)。
您的调试版本是否已完全禁用优化(/ Od)?
Visual Studio帮助还包含一个声明(在“优化最佳实践”下),阻止64位代码中的try / catch块。
如果在发布版本中关闭优化,则链接器不会崩溃。 如果只删除“continue”语句,它也不会崩溃(但会重现不良行为)。
if (1==0) {
//continue;
}
尝试开关/ FAs开关:
http://msdn.microsoft.com/en-us/library/367y26c6%28v=vs.80%29.ASPX
在“编译器设置”中的“附加输出文件”中的某处。 (确保所有其他设置都相同)
然后,在两个输出之间进行差异。 在这里发布差异。 我相信有些人可以告诉你原因和方法,也许还有一些编译器设置或代码解决方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.