理解错误“在抛出 'std::length_error'what() 实例后调用终止:basic_string::_S_create Aborted (core dumped)”
Posted
技术标签:
【中文标题】理解错误“在抛出 \'std::length_error\'what() 实例后调用终止:basic_string::_S_create Aborted (core dumped)”【英文标题】:Understanding error "terminate called after throwing an instance of 'std::length_error' what(): basic_string::_S_create Aborted (core dumped)"理解错误“在抛出 'std::length_error'what() 实例后调用终止:basic_string::_S_create Aborted (core dumped)” 【发布时间】:2013-11-27 23:16:54 【问题描述】:这是我的错误:
terminate called after throwing an instance of 'std::length_error'
what(): basic_string::_S_create
Aborted (core dumped)
这是我的代码:
//Code removed
string generateSong(string list[], int num)
//Code removed
//Code removed
for (i = 0; i < num; i++)
output += list[i];
output += bone1;
output += list[i + 1];
output += bone2;
return output;
int main()
string list[9] =
//Code removed
;
//Code removed
return 0;
我只想知道这个错误是什么意思,所以我知道如何解决它。我看过很多帖子都有类似的错误,但没有完全相同的错误。从字面上看,我只是从 C++ 开始,这些答案都与我迄今为止所学的没有任何意义。如您所见,这是一个输出歌曲的简单程序。它旨在帮助我为正在上的课程练习弦乐,但这对我来说绝对没有意义,而且这本书也没有太大帮助。有人可以向我解释一下吗?
附:如果这有帮助,它将使用 g++ 进行编译,但是当它运行时会出现该错误(所以基本上这不是编译错误,而是运行错误)。
【问题讨论】:
为了帮助调试,您可以使用 list.at(i) 和 list.at(i+1) ,它们通常会通过更有用的消息告诉您索引溢出。 【参考方案1】:这部分代码有问题:
for (i = 0; i < num; i++)
output += list[i];
output += bone1;
output += list[i + 1]; // <--- here
output += bone2;
您的数组长度为 9,因此其中的有效索引范围为 0、1、2、...、8。在第 8 次迭代中,指示的行将尝试读取无效的数组索引 9。这会导致未定义的行为,在您的情况下,这是关于无效字符串的误导性错误消息。
您必须决定要采取哪些步骤来解决此问题,但我相信这是问题的直接原因。
希望这会有所帮助!
【讨论】:
非常感谢!你完全准确。当您指出这一点时,我意识到这确实是错误。在我的课堂上,我们最近从使用数组转为使用字符串,我习惯于数组在离开数组时只显示行话,而字符串是不同的。无论如何,非常感谢你们。这正是所需要的,我更正了 for 循环以正确显示。 :)【参考方案2】:如果你有 9 个骨骼,你应该只打印 8 个连接,而不是 9 个。在最后一个引用 bone[8]
和 bone[9]
上。 bone[9]
不存在。
【讨论】:
【参考方案3】:类似的错误:
执行以下语句时,我将count
设为-1
:
cout << string(count, ' ') << "main - end " << endl;
string(count, ' ')
创建一个长度为count
的空格字符串,但由于count
为-ve,因此无法创建。
所以基本上任何其他库函数都可能失败,仔细编写代码和仔细调试会有所帮助。
【讨论】:
以上是关于理解错误“在抛出 'std::length_error'what() 实例后调用终止:basic_string::_S_create Aborted (core dumped)”的主要内容,如果未能解决你的问题,请参考以下文章