17

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」で例外がキャッチされます。

私は他のコンパイラを使用してみました:

  • このバグは VS 2012 でも発生します。
  • MinGW と MinGW-w64 は期待どおりに動作します。

私の質問: これは MSVC のバグですか、それとも C++ の未定義の動作ですか? これが実際に MSVC のバグである場合は、原因についての洞察を聞きたいです。

ありがとう。

4

3 に答える 3

0

これは以前から知られている問題であり、掘り下げた結果、以前に判明したものです。

http://social.msdn.microsoft.com/Forums/en-US/19eb8218-0dc4-4e4f-954f-4c4c3b3cd118/why-am-i-not-being-alerted-of-exceptions-from-methods-that- are-run-when-the-application-loads?forum=csharpide

于 2013-11-01T11:17:55.650 に答える