web-dev-qa-db-fra.com

Comprendre l'erreur "terminate appelé après avoir lancé une instance de 'std :: length_error' what (): basic_string :: _ S_create Aborted (core dumped)"

Voici donc mon erreur:

terminate called after throwing an instance of 'std::length_error'
  what():  basic_string::_S_create
Aborted (core dumped)

et voici mon code:

//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;
}

Je voudrais juste savoir ce que signifie cette erreur, donc je sais comment y remédier. J'ai vu de nombreux messages avec des erreurs similaires, mais rien de pareil. Je débute littéralement en C++, et aucune de ces réponses n'a de sens avec ce que j'ai appris jusqu'à présent. Comme vous pouvez le voir, c'est un programme simple pour sortir une chanson. Il est destiné à m'aider à pratiquer les cordes pour le cours que je prends, mais cela n'a absolument aucun sens pour moi et le livre n'est pas très utile non plus. Quelqu'un pourrait-il m'expliquer cela?

P.S. Dans le cas où cela serait utile, il compilera en utilisant g ++, mais quand il s'exécutera, il donnera cette erreur (donc en gros ce n'est pas une erreur de compilation, c'est une erreur d'exécution).

13
scbeacham

Cette partie du code est suspecte:

 for (i = 0; i < num; i++)
 {
    output += list[i];
    output += bone1;
    output += list[i + 1]; // <--- here
    output += bone2;
 }

Votre tableau a une longueur de 9, donc les indices valides vont de 0, 1, 2, ..., 8. À l'itération 8, la ligne indiquée essaiera de lire l'index du tableau 9, qui n'est pas valide. Il en résulte un comportement indéfini, qui dans votre cas est un message d'erreur trompeur sur une chaîne non valide.

Vous devrez décider des mesures que vous souhaitez prendre pour résoudre ce problème, mais je pense que c'est la cause immédiate du problème.

J'espère que cela t'aides!

12
templatetypedef

Si vous avez 9 os, vous ne devez imprimer que 8 connexions, pas 9. Sur la dernière, vous référencez bone[8] & bone[9]. bone[9] n'existe pas.

2
woolstar