【发布时间】:2023-03-25 00:07:01
【问题描述】:
我正在用 C++ 编写程序。该程序在 Win32 (x86) 上运行良好,最近我尝试为 x64 本地编译它。当然,事情并没有立即奏效。
在调试问题后,我设法用这个简单的代码 sn-p 重现它:
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”中捕获。
我尝试过使用其他编译器:
- 这个错误也发生在 VS 2012 中。
- MinGW 和 MinGW-w64 按预期工作。
我的问题:这是一个 MSVC 错误,还是我缺少的 C++ 中的一些未定义行为? 如果这确实是一个 MSVC 错误,我很想听听有关原因的一些见解。
谢谢。
【问题讨论】:
-
几乎可以肯定是编译器错误,如果您在 MS Connect 提交错误报告(您可以链接此问题)并在此处留下链接,那么我会支持它。很高兴看到 Microsoft 工程师对此有何评论。
-
不错的发现!我刚刚试了一下。首先,它会在 64 位发布版本中使链接器崩溃。其次,我可以只用
continue复制它。围绕它的if声明是不必要的。使用VS2012更新3。 -
我在MS Connect 上打开了一个错误报告。
-
在 VS2013 发布版本中生成内部编译器错误,绝对是编译器错误。
-
我以前见过这种行为。那是很久以前的事了,我记得它特别是一个编译器错误。 和解决方法有一个明确的原因。但是,如果我能再次找到它,我会被诅咒的。那是很久以前的事了。抱歉,我无法为您提供更具体的信息,但这绝对是一个错误(之前遇到过)。
标签: c++ windows exception visual-c++ 64-bit