2012-05-01 8 views
0
vector <string> inputarrayconverted = { ... }; 

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

が機能しません。それは私に "デバッグアサーション失敗!"メッセージ。 !ベクトル 式:ベクトル添字私がやろうとしているすべては、配列位置がint型である場合、その値を変更するには、「n」はarraypositionがintの場合...?

エラーが ある「デバッグアサーションが失敗したことを

ファイルを確認しています範囲外 "

しかし、なぜ私の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()  
+0

ご質問はありますか? – user1118321

+0

私のコンパイラ(VS2010)が私に "Debug Assertion Failed!"を与えるのはなぜですか?それは完全に受け入れられるコードのようです... –

+0

アサーションをヒットしたときのスタックトレースはどのように見えますか?どのコールがアサートしていますか? 'atoi()'? 'c_str()'?配列の割り当て? – user1118321

答えて

3

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

4

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

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

)(でのメンバ関数は、コンテナ に境界-確認のアクセスを提供します:あなたは、境界がアクセスを確認したいと同様のアクセスを行うvector::at()を使用しますが、境界がチェックされ、例外がスローされます

要素。 at()は、n> = a.size()の場合、out_of_rangeをスローします。

だから、あなたの代わりにintstd::out_of_rangeをキャッチしたいと思うでしょう、そしてあなたはそれのための宣言を取得する#include <stdexcept>が必要になります。

関連する問題