2012-12-16 2 views
0

이 조각에서보세요? 이 콘솔 출력 (g로 컴파일 ++ -o 테스트 Test.cpp에의 -g)이상한 분할 오류 사용하여 표준 : : 벡터

./test 
Test String 
zsh: segmentation fault ./test 

인 클래스 유래 v.end()의 포인터가 올바른 위치를 가리 키지 않는 ... 하지만 왜?

+0

'v.end()'이터레이터로 접근하는 것은 올바르지 않습니다. 이 반복자는 항상 유효하지 않습니다. – triclosan

+0

기본 클래스 소멸자를 가상으로 만드는 것을 잊지 마십시오. –

+0

세그멘테이션 폴트가 반복하기 쉬운 경우 일반적으로 디버거에서 실행하여 세그먼테이션 폴트의 정확한 위치를 찾을 수 있습니다. "이상한"것에 관해서는, 액세스가 허용되지 않는 메모리에 액세스하려고 시도하지 않으면 이상하지 않습니다. – mah

답변

12

end()은 마지막 요소를 가리키는 반복자가 아닙니다. 그것은 마지막 요소를 지나서 하나를 가리킨다. Dereferencing end()은 불법입니다.

마지막 요소를 원하면 back()을 사용하십시오.

+2

당신이하고있는 일에 따라'rbegin()'이 적절할 수도 있습니다. – zwol

+0

오, 젠장, 네가 맞아. 잊어 버렸어. 이것은 2 일 비용이 들었다 .-- (고마워! – rralf

3

문제는 v.end()를 사용하는 것입니다.

는 반환 벡터 컨테이너에 준 past-the-end 요소를 참조 반복자를 종료 here

반환 반복자에서 인용.

past-the-end 요소는 벡터의 마지막 요소 뒤에 오는 이론적 요소입니다. 어떤 요소도 가리 키지 않으므로 역 참조하면 안됩니다.

표준 라이브러리의 함수에서 사용하는 범위에는 닫는 반복자가 가리키는 요소가 포함되어 있지 않으므로이 함수는 vector :: begin과 함께 사용되어 컨테이너의 모든 요소를 ​​포함하는 범위를 지정하는 경우가 많습니다.

컨테이너가 비어 있으면이 함수는 vector :: begin과 동일하게 반환합니다.

대신 v [0]을 사용하십시오. (이 특정 테스트에서는 인용 된 페이지의 벡터 게터에 대한 다른 제안 사항을 참조하십시오).