이 조각에서보세요? 이 콘솔 출력 (g로 컴파일 ++ -o 테스트 Test.cpp에의 -g)이상한 분할 오류 사용하여 표준 : : 벡터
./test
Test String
zsh: segmentation fault ./test
인 클래스 유래 v.end()의 포인터가 올바른 위치를 가리 키지 않는 ... 하지만 왜?
이 조각에서보세요? 이 콘솔 출력 (g로 컴파일 ++ -o 테스트 Test.cpp에의 -g)이상한 분할 오류 사용하여 표준 : : 벡터
./test
Test String
zsh: segmentation fault ./test
인 클래스 유래 v.end()의 포인터가 올바른 위치를 가리 키지 않는 ... 하지만 왜?
문제는 v.end()를 사용하는 것입니다.
는 반환 벡터 컨테이너에 준 past-the-end 요소를 참조 반복자를 종료 here반환 반복자에서 인용.
past-the-end 요소는 벡터의 마지막 요소 뒤에 오는 이론적 요소입니다. 어떤 요소도 가리 키지 않으므로 역 참조하면 안됩니다.
표준 라이브러리의 함수에서 사용하는 범위에는 닫는 반복자가 가리키는 요소가 포함되어 있지 않으므로이 함수는 vector :: begin과 함께 사용되어 컨테이너의 모든 요소를 포함하는 범위를 지정하는 경우가 많습니다.
컨테이너가 비어 있으면이 함수는 vector :: begin과 동일하게 반환합니다.
대신 v [0]을 사용하십시오. (이 특정 테스트에서는 인용 된 페이지의 벡터 게터에 대한 다른 제안 사항을 참조하십시오).
'v.end()'이터레이터로 접근하는 것은 올바르지 않습니다. 이 반복자는 항상 유효하지 않습니다. – triclosan
기본 클래스 소멸자를 가상으로 만드는 것을 잊지 마십시오. –
세그멘테이션 폴트가 반복하기 쉬운 경우 일반적으로 디버거에서 실행하여 세그먼테이션 폴트의 정확한 위치를 찾을 수 있습니다. "이상한"것에 관해서는, 액세스가 허용되지 않는 메모리에 액세스하려고 시도하지 않으면 이상하지 않습니다. – mah