2010-05-27 2 views
0

나는이처럼 보이는 각 노드 라인의 연결 목록이있는 파일을 처리 해요 :std :: out_of_range 오류가 발생 했습니까?

struct TextLine{ 
    //The actual text 
    string text; 
    //The line number of the document 
    int line_num; 
    //A pointer to the next line 
    TextLine * next; 
}; 

내가 변수 text에있는 라인의 시작 부분에 공백을 추가하는 기능을 쓰고 있어요 , linelist_ptr->text.insert(0,1,'\t');

이 프로그램은 컴파일,하지만 난 그것을 실행할 때이 오류가 얻을 같은 함수를 호출하여 :

terminate called after throwing an instance of 'std::out_of_range' 
    what(): basic_string::at 
Aborted 

어떤 아이디어? linelist_ptr 합법적 인 값, 즉을 가지고

+2

충분한 정보를 제공하지 않았습니다. 당신이 제공 한 코드는 당신이 묘사하는 방식대로 실패 할 수 없으므로 여기에 넣지 않은 다른 코드가 실패 할 수도 있습니다. – Omnifarious

+3

'std :: list'를 사용하지 않는 이유는 무엇입니까? (Homework?) 또는 더 나은,'std :: vector' 또는'std :: deque'. – GManNickG

+1

당신의 구현이 우연히'char *'를'string :: iterator'로 사용하는지 확인해 주시겠습니까? '#include '그리고'std :: cout << typeid (std :: string :: iterator) .name()'을 수행하고 그 결과를 말할 수있다. –

답변

0

확인 당신은 new가 에드 (그리고 전에 당신이 그것을 사용하는 delete되었습니다 거라고하지 않은) 당신은 표준 : : 문자열을 사용하는

+0

이들 중 어느 것도 std :: out_of_range를 던지지 않습니다. 모두 정의되지 않은 동작이며 세그먼트 오류가 발생할 가능성이 높습니다. – CMircea

+2

내가 생각한 것은 포인터가 쓰일 때 std :: string으로 해석 된 쓰레기 위치를 포인터가 가리키고있는 경우였다. – hamishmcn

+0

그는 포인터를 역 참조합니다. 어떻게하면 at()가 호출 될 수 있습니까? – CMircea

1

::에이 그 () 어딘가에 코드하지만 잘못된 인덱스를 전달하는, 따라서 던졌습니다. 예외를 잡아 내지 못하기 때문에 main()에서 전파되고 terminate()가 호출되어 프로세스가 종료됩니다.

std :: string :: insert()가 std :: string :: at()을 호출하지 않으며 매개 변수도 아니므로 표시된 코드는 이러한 방식으로 실패 할 수 없습니다. 코드에 예외 처리를 추가하십시오. 여전히 버그를 찾을 수없는 경우 코드의 더 큰 섹션 (또는 전체 파일은 http://codepad.org으로 게시하는 것이 좋습니다)을 게시하십시오.

+3

잘못되었습니다. ISO C++ 03은 index가 범위를 벗어나는 경우'insert()'가'std :: out_of_range'를 던져야한다고 지정합니다 (21.3.5.4 [lib.string :: insert]/3 : "throws out_of_range pos1> size) 또는 pos2> str.size(). "). 'at()'를 호출하여이 요구 사항을 구현하는 것은 완전히 합법적입니다. –

+1

@Pavel, 괜찮아. 그러나 인덱스가 0 인 유효한 원인 (std :: string의 범위 내에 있음)은 원인이 아닙니다. – CMircea

1

당신이 묘사 한 것에서 가장 큰 문제는 insert()가 문자열의 끝에서 유효하지 않은 위치 (즉, size())에서 호출된다는 것입니다. 이 예제는과 같은 이므로 위 예제 코드와 다르게 위치를 전달하는 위치에 작성한 코드를 확인하고 값이 예상 한 값인지 확인하십시오.

종료 메시지는 try/catch 블록을 통해 out_of_range 예외를 처리하지 않기 때문에 예외적으로 프로그램을 종료하는 C++ 언어 런타임까지 이스케이프 처리합니다.