C ++exception“跳过”MSVC x64中的Try-Catch子句

我正在用C ++编写一个程序。 该程序一直在Win32(x86)正常工作,最近我已经尝试编译本机的X64。 当然,东西没有马上工作。

在debugging问题后,我已经设法用这个简单的代码片段重现它:

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 

这个exception完全跳过了内部catch子句!

只有当我的代码中存在if (1 ==0)子句时才会发生这种情况。 当我删除它时,exception被捕获到“Catch 1”如预期。

我试过使用其他编译器:

  • 这个错误也发生在VS 2012。
  • MinGW和MinGW-w64按预期工作。

我的问题:这是一个MSVC的错误,或者这是一些未定义的行为,在C + +我失踪了? 如果这确实是一个MSVC的错误,我想听听有关的原因一些洞察力。

谢谢。

Solutions Collecting From Web of "C ++exception“跳过”MSVC x64中的Try-Catch子句"

这个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

在“编译器设置”的“附加输出文件”中。 (确保所有其他设置是相同的)

然后,在两个输出之间做一个差异。 在这里发表差异。 我相信有些人可以告诉你为什么和如何,也许一些编译器设置或代码解决方法。