0
    vector <string> inputarrayconverted = { ... };

    try
    {
    if (atoi(inputarrayconverted[p].c_str()) >= 0)
    {
        inputarrayconverted[p] = "n";
    }
}
catch (int e) { }`

動かない。「デバッグアサーションに失敗しました!」メッセージ。私がやろうとしているのは、配列の位置がintの場合、その値を「n」に変更することを確認することだけです。

エラーは「デバッグアサーションに失敗しました!

ファイル:ベクター式:ベクター添え字が範囲外です」

しかし、なぜ私のtryブロックがこれをキャッチしないのですか?それが私の質問です。

これはスタックトレースです。(私は信じている)

msvcp100d.dll!590599f3()
[Frames below may be incorrect and/or missing, no symbols loaded for msvcp100d.dll] 
Paradigms Assignment 2 C Plus Plus.exe!std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >::operator[](unsigned int _Pos=0)  Line 932 + 0x17 bytes C++
Paradigms Assignment 2 C Plus Plus.exe!wmain(int argc=1, wchar_t * * argv=0x00314af8)  Line 148 + 0x12 bytes    C++
Paradigms Assignment 2 C Plus Plus.exe!__tmainCRTStartup()  Line 552 + 0x19 bytes   C
Paradigms Assignment 2 C Plus Plus.exe!wmainCRTStartup()  Line 371  C
kernel32.dll!7647339a()     
ntdll.dll!77909ef2()    
ntdll.dll!77909ec5()    
4

2 に答える 2

4

vectorのoperator[]()アクセス関数は、範囲外のアクセスで例外をスローしません。これは単に未定義の動作です。範囲内にあるインデックス値を扱っていることを知っているコードは、ライブラリが不必要にダブルチェックするためにペナルティを支払う必要がないという考えです。

デバッグ ライブラリがチェックを実行するため、デバッグ アサーションを取得していますが、表示されるアサーションの形式になっています。デバッグ ビルドで例外が生成され、それがデバッグ ビルドではキャッチできるがリリース ビルドではキャッチできないことは不適切です。

境界をチェックしたアクセスが必要な場合は、同様のアクセスを実行するを使用vector::at()しますが、境界がチェックされ、例外がスローされます。

メンバー関数 at() は、コンテナー要素への境界チェック済みアクセスを提供します。n >= a.size() の場合、at() は out_of_range をスローします。

std::out_of_rangeしたがって、の代わりにcatchが必要になり、その宣言を取得するにintは が必要になります。#include <stdexcept>

于 2012-05-01T05:04:46.050 に答える
3

変数pに、ベクトルの要素数の範囲外の値が含まれています。(負か、大きすぎるか、配列が空です。) アサーションは、開発中に何か問題があることを通知するものですが、例外は実行時の問題を処理します。私は Visual Studio についてよく知らないので、標準ライブラリのバージョンに、アサーションから例外に切り替えるように設定できるフラグがあるかどうかはわかりません。(リリースを構築するだけでよいのでしょうか?)

于 2012-05-01T04:52:58.170 に答える