2012-10-08 3 views
0

이 코드가 예외를 던지는하지 반복자를 확인 :Visual Studio에서

#ifdef _DEBUG 
#define _SECURE_SCL 1 
#define _SECURE_SCL_THROWS 1 
#else 
#define _SECURE_SCL 0 
#define _SECURE_SCL_THROWS 0 
#endif 

#include <iostream> 
#include <vector> 


using namespace std; 




int main() 
{ 
    vector <int> v1; 
    v1.push_back(33); 

    vector <int>::iterator it1 = v1.begin(); 

    try 
    { 
     it1++; 

     it1++; 
    } 
    catch (...) 
    { 
     cout << "vector is empty!!" << endl; 
    } 

    return 0; 
} 

예쁜 간단한 : 나는 과거 - 더 - 경계를 이동하려고 나는 예외가 잡힐 싶어요. 그러나 프로그램이 단순히 "디버그 어설 션 실패!" 두 번째 증가분에, 왜 그런가요?

이 예제는 http://msdn.microsoft.com/en-us/library/aa985965(v=vs.100).aspx에서 가져온 것으로, 매크로를 추가하여 체크 된 이터레이터를 설정했습니다. 내가 디버그 모드에있어,/EHsc는에 그래서 IS/MDD

+0

벡터 헤더를 포함시키기 전에 이러한 매크로를 정의해야한다고 생각합니다. –

+0

@NathanMonteleone : 그는 그 매크로를 전혀 정의하지 말아야합니다. 그가 링크 한 기사에 따르면, 그는'/ D_DEBUG/EHsc/MDd'로 컴파일해야합니다. –

+0

소스 코드에서 매크로를 정의한 것과 같지 않습니까? –

답변

1

새 버전의 Visual C++ 라이브러리 (Visual Studio 2010에 번들로 제공)는 체크 된 이터레이터에서 예외를 throw하는 것을 지원하지 않습니다. http://wishmesh.com/2010/04/it-seems-that-_secure_scl_throws-is-deprecated-in-visual-studio-c-2010/

+0

그 문제를 해결할 수 있지만 설명서가 더 명확하게되었을 수 있습니다 .. 감사합니다 –

+0

@JohnnyPauling : 다음 버전에 대한 설명서를 수정 한 것 같습니다. http://msdn.microsoft .com/ko-us/library/aa985965 (v = vs.110) .aspx –

0

A는 반복자 확인 예외 을 던지거나 당신이 컨테이너의 경계 과거 이동하려고하면 INVALID_PARAMETER 호출하는 반복자를 말한다 .

예제 코드는 반복기를 움직이고 있지 않으므로 던져 질 것이라는 생각이 들지 않습니다.

+0

감사하지만 그게 내 문제를 해결하지 못했지만, 질문의 코드를 변경했습니다 –

+0

질문이 변경됨 –

1

귀하의 질문에서 가장 중요한 부분은 #include입니다.

위 매크로를 넣으려면 #include 줄이 필요합니다. 미리 컴파일 된 헤더를 사용하는 경우 미리 컴파일 된 헤더에 해당 헤더를 넣어야합니다.

질문에있는 코드가 완전하지 않기 때문에이 권한을 부여했는지 여부를 알 수 없습니다. 나는 네가 그렇게하지 않았다고 생각한다. 그래서 나는 이것을 대답으로 제시하고있다.

+0

질문이 변경되었습니다. –

+0

고맙습니다. 그 위에 움직여 보았지만 아무 것도 변경되지 않았습니다. 컴파일러가 저에게 경고하는 것을 제외하고는 "경고 CRT1008 : _SECURE_SCL_THROWS는 더 이상 사용되지 않습니다 " –

+0

@ JohnnyPauling : 그 메시지를 내보내는'# warning' 행을 보면, 근처에 다른 접근법을 제안하는 코멘트가 있습니까? –