2010-05-27 115 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 

任何想法?

+2

您沒有提供足夠的信息。你所提供的代碼不能以你描述的方式失敗,所以也許其他一些代碼失敗了,你還沒有放在這裏。 – Omnifarious 2010-05-27 03:33:54

+3

任何你不使用'std :: list'的原因? (家庭作業?)甚至更好,'std :: vector'或'std :: deque'。 – GManNickG 2010-05-27 03:39:53

+1

你可以請檢查一下你的實現是否使用'char *'作爲'string :: iterator'?你可以做'#include ',然後'std :: cout << typeid(std :: string :: iterator).name()' - 並告訴結果。 – 2010-05-27 03:51:57

回答

0

檢查linelist_ptr具有合法的值,即你有new編它(和它沒有你使用它之前一直delete D)

+0

這些都不會拋出std :: out_of_range,根本不會。所有這些都是未定義的行爲,很可能只是導致分段錯誤。 – CMircea 2010-05-27 03:42:02

+2

我在想的是,如果指針指向一個垃圾位置,然後在調用時被解釋爲std :: string。 – hamishmcn 2010-05-27 03:57:12

+0

他正在解引用指針。 ()被調用的可能性如何? – CMircea 2010-05-27 04:15:40

1

您正在使用的std :: string ::在( )在你的代碼中的某處,但你傳遞了一個不正確的索引,因此它拋出。由於您沒有捕獲任何異常,它會傳播出main()和terminate()被調用,從而終止進程。

您曾表示這種方式不能失敗的代碼,爲的std :: string ::插入()不調用的std :: string ::在(),也不是參數。請將異常處理添加到您的代碼中,如果您仍然無法找到該錯誤,請發佈大部分代碼(或整個文件,最好是http://codepad.org)。

+3

這是錯誤的。 ISO C++ 03指定如果索引超出範圍(21.3.5.4 [lib.string :: insert]/3:「拋出:out_of_range,如果pos1> size(),insert()'應該拋出'std :: out_of_range' )或pos2> str.size()。「)。通過調用'at()'來實現這個要求是完全合法的。 – 2010-05-27 03:48:58

+1

@Pavel,好的。但是,這不是索引爲0的原因 - 它在任何有效的std :: string範圍內。 – CMircea 2010-05-27 04:16:37

1

我想從你所描述什麼是最可能的問題是插入()被調用用的字符串的結束無效的位置(即>大小())。你說的這個例子是你調用的功能,所以請你可能已經寫的那些,你可能有不同的通過位置比上面的示例代碼,並確保該值是你所期望的。

終止消息是因爲您沒有處理out_of_range異常(通過try/catch塊),所以它會轉移到C++語言運行時,這會不經意地關閉程序。

相關問題