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

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

이 작동하지 않습니다. 그것은 나에게 "디버그 어설 션 실패!" 메시지. ! 벡터 표현 : 벡터 첨자 내가 할 노력하고있어 모든 배열 위치를 int 인 경우에 "N"arrayposition이 int 인 경우 ...?

오류가 "디버그 어설 션이 실패

파일의 값을 변경하는 것이 확인하다 범위를 벗어남 "

그러나 왜 내 시도 블록이이를 잡지 못하는 것입니까? 그게 내 질문이다.

이것은 스택 추적입니다.

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)가 나에게 "디버그 어설 션 실패!"를 표시하는 이유는 무엇입니까? 그것은 완벽하게 수용 가능한 코드처럼 보입니다 ... –

+0

어설 션을 치면 스택 트레이스는 어떻게 생깁니 까? 어느 전화가 주장하고 있습니까? 'atoi()'? 'c_str()'? 배열 할당? – user1118321

답변

3

가변 p은 벡터의 요소 수의 범위를 벗어난 값을 포함한다 (I 믿는다). (음수이거나 너무 큽니다. 배열이 비어 있습니다.) 어설 션은 개발 중에 문제가 있음을 알려주는 반면 예외는 런타임 문제를 처리합니다. 나는 Visual Studio를 잘 모르기 때문에 표준 라이브러리의 버전에 어설 션에서 예외로 전환 할 수있는 플래그가 있는지 확실하지 않습니다. (어쩌면 그냥 건물을 출시합니까?)

4

벡터의 operator[]() 액세스 기능은 범위를 벗어난 액세스에 예외를 던지지 않습니다. 이는 단순히 정의되지 않은 동작입니다. 범위 내에있는 인덱스 값을 처리한다는 것을 알고있는 코드는 불필요하게 라이브러리를 다시 확인해야하는 불이익을 지불하면 안됩니다.

디버그 라이브러리가 검사를 수행하기 때문에 디버그 어설 션이 표시되지만 표시되는 어설 션의 형태로 나타납니다. 디버그 빌드가 디버그 빌드에서는 catch 될 수 있지만 릴리스 빌드에서는 catch 될 수없는 예외를 생성하는 것은 부적절합니다.

()에서 멤버 함수는 컨테이너 에 경계 - 검사 액세스를 제공합니다 : 당신이 경계 액세스를 확인하려면 유사한 액세스를 수행 vector::at()를 사용하지만 경계가 확인되고, 예외가 던져 질 경우

집단. at()는 n> = a.size() 인 경우 out_of_range를 throw합니다.

그래서, 당신은 대신 intstd::out_of_range을 잡으려고 할 것입니다, 당신은 그것을 선언을 얻을 수있는 #include <stdexcept>가 필요합니다.

관련 문제