2010-05-27 87 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++语言运行时,这会不经意地关闭程序。

相关问题