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 

Любые идеи?

+2

Вы не предоставили достаточную информацию. Код, который вы указали, не может терпеть неудачу в том, как вы описываете, так что, возможно, какой-то другой код терпит неудачу, которого вы не указали здесь. – Omnifarious

+3

По какой причине вы не используете 'std :: list'? (Домашнее задание?) Или даже лучше, 'std :: vector', или' std :: deque'. – GManNickG

+1

Можете ли вы проверить, случайно ли ваша реализация использует 'char *' как 'string :: iterator'? Вы можете сделать '#include ', а затем 'std :: cout << typeid (std :: string :: iterator) .name()' - и сообщить результат. –

ответ

0

Убедитесь, что linelist_ptr имеет законное значение, то есть, что у вас есть new эд его (и это не было delete d до вы его используете)

+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 указывает, что 'insert()' должен бросать 'std :: out_of_range', если индекс вне диапазона (21.3.5.4 [lib.string :: insert]/3:« Throws: out_of_range if pos1> size () или pos2> str.size(). "). Для него совершенно законно выполнять это требование, вызывая 'at()'. –

+1

@Pavel, хорошо. Однако это не причина, так как индекс равен 0 - который находится в диапазоне любой допустимой строки std ::. – CMircea

1

Я думаю, что наиболее вероятная проблема в том, что вы описали, заключается в том, что insert() вызывается с недопустимой позицией с конца строки (т. Е.> Size()). Вы говорите, что этот пример: как функции, которые вы вызываете, поэтому проверьте те, которые вы, возможно, написали, где вы могли бы передавать позицию иначе, чем приведенный выше пример кода, и убедитесь, что это то, что вы ожидаете.

Сообщение о завершении работы связано с тем, что вы не обрабатываете исключение out_of_range (через блоки try/catch), поэтому оно выходит за пределы исполняемого файла языка C++, что бесцеремонно закрывает вашу программу.

Смежные вопросы