理解错误“在抛出 '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)”的主要内容,如果未能解决你的问题,请参考以下文章

如何理解 Java 热点错误

我无法理解原因的属性错误

应用程序不断停止,logcat 错误无法理解

PL/SQL 函数错误 - 无法理解

代码点火器错误“地址不被理解”

使用字典理解时如何避免丢失键的错误