2010-03-10 4 views
7

VS2005 SP1의 디버그 구성에서 컴파일 된 아래 코드는 "ITERATOR LIST CORRUPTED"알림 메시지를 보여줍니다. 그것은 컴파일러 또는 표준 라이브러리의 버그std :: string 생성자에서 오류가 발생한 ITERATOR 목록

코드 조각

#define _SECURE_SCL 0 
#define _HAS_ITERATOR_DEBUGGING 0 

#include <sstream> 
#include <string> 

int main() 
{ 
    std::stringstream stream; 
    stream << "123" << std::endl; 
    std::string str = stream.str(); 
    std::string::const_iterator itFirst = str.begin(); 
    int position = str.find('2'); 
    std::string::const_iterator itSecond = itFirst + position; 
    std::string tempStr(itFirst,itSecond); ///< errors are here 
    return 0; 
} 

인가?

+0

VS2008에서도 마찬가지입니다. 매혹적인. – avakar

+0

gc와의 신속한 테스트를 위해 codepad.org 사용을 고려하십시오. http://codepad.org/mXXYxf99 이것은 분명히 windows/visual 스튜디오 버그입니다. 그것을보고하십시오. –

답변

2

@dirkgently 그의 편집에서 말했다.

std::string의 일부 코드는 런타임 dll에 있으며, 특히 반복자 디버깅을위한 코드가 실행되는 생성자에 대해 매크로 정의가 적용되지 않습니다. 런타임 라이브러리를 정적으로 링크하여이 문제를 해결할 수 있습니다.

아마도이 문제는 Visual Studio 자체에서는 아니지만 설명서에는 있지만 버그라고 생각합니다.

+0

감사합니다. 정적으로 링크하면 문제가 해결됩니다. –

3

나쁘다! 편집 : 예 컴파일러와 문제. this - 특히 커뮤니티 콘텐츠 섹션을 참조하십시오.

+0

무슨 뜻인가요? 'std :: string'에는 무작위 접근 반복자가 있습니다. – avakar

+0

왜 코드가 컴파일 가능합니까? – Vlad

0

코드에 문제가 있습니다. 음, 사실 몇 가지 다음 size_t의 값이 반환하는 경우

  1. std.find('2')size_t 반환, 당신은 잠재적 인 캐스트 문제가 (std::string::npos를 같은)을 int에 저장할 수있는 우수하다 (당신은 부정적으로 끝낼 것 INT 나는 position가 (그 범위 itFirst,itSecond가 잘못 정의되어 부정, 또는 std::string::npos 동일
  2. 경우) ... 생각 중 itSeconditFirst 전에 또는 때문에 과거 때문에 str.end())

코드를 수정하고 여전히 던져 지는지 확인하십시오. 반복자 디버깅은 이러한 실수를 포착하고 타조처럼 작동하지 않도록 도와줍니다.

+1

find()의 문자열 버전은 실제로 std :: string :: size_type을 반환합니다. –

+0

일반적으로 당신이 옳았는데,이 특별한 경우에는'_HAS_ITERATOR_DEBUGGING'이 꺼져 있습니다. '_HAS_ITERATOR_DEBUGGING'을 1로 설정하면 에러가 없습니다. 따라서, CRT의 버그 인 것 같습니다. – Paul

+0

@Neil : 사실, 대부분의 컨테이너는 모든 인덱싱 목적을 위해 내부 typedef 인'size_type'을 효과적으로 사용합니다. STL의 (몇 가지) 구현에서'size_t '가 아닌 것을 본 적이 없었습니다. 진짜 문제는 부호가없는 값이 아니라는 것입니다 (감미로운 파이썬을 사용하지 않는 한 음의 색인은 의미가 없으므로). –

관련 문제