0

バッファ配列から文字列を抽出するための次のコードがあります。それは正常に動作します。ただし、長さ変数は実行時に決定されるため、範囲外になると例外が発生します。もちろん、長さ変数 (オフセット変数に関連する) が境界内にあるかどうかをチェックするようにコードを簡単に調整できます。例外が try-catch ステートメントを通過するように見える (そしてデバッガーによってキャッチされる) ため、次のコードが機能しない理由が気になります。

try
{
    string value(&buffer[offset], length);
    // ...
}
catch (exception& e)
{
    // ...
}
catch (...)
{
    // ...
}

Windows 7 64 ビットで実行され、MSVCR がコンパイルされています。

4

3 に答える 3

5

buffer境界を超えて配列にアクセスすることは、未定義の動作です。この場合、C++例外をスローする必要はありません。tryブロックの外側で文字列をインスタンス化してみてください。そうすれば、例外がスローされるかどうかが確実にわかります。

于 2013-02-12T10:49:26.847 に答える
1

「例外」という言葉はあなたを混乱させていると思います。キャッチできる例外について話すときcatch、一般的なコンピューター サイエンスの意味での「例外」を意味するわけではありません。具体的には、操作でスローされる C++ 例外を意味しthrowます。

例外をスローするコードはありませんが、なぜキャッチする必要があるのでしょうか? この場合に例外をスローしたい場合は、そのためのコードを作成する必要があります。

ゼロ除算などをキャッチできることを期待しているプログラマーを時々見かけます。これは一般的なコンピューター サイエンスの意味では例外ですが、ゼロ除算があったときに C++ 例外を作成してスローするコードがない限り、C++ 例外ではありません。

于 2013-02-12T10:54:25.590 に答える
1

プログラムはfault、NULL ポインターの逆参照 (常にフォールト) やヒープ内の変数の境界外への移動 (常にフォールトとは限りません。ページ境界上)。これらfaultsは CPU によって検出され、C++ の try/catch でキャッチできる例外とは異なるメカニズムです。これらは言語の一部であり、コンパイラと言語ランタイム ライブラリによって実装されます。

あなたの場合、MSVC を使用しているため、__try と __except 機能の両方をキャッチできる言語の拡張機能にアクセスできます。MSVC のtry-except ステートメントの詳細については、こちらを参照してください

于 2013-02-12T10:59:13.010 に答える