web-dev-qa-db-ja.com

エラー「「std :: length_error」のインスタンスをスローした後に呼び出される終了what():basic_string :: _ S_create Aborted(core dumped)」の理解

だからここに私のエラーがあります:

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 ++を使用してコンパイルしますが、実行するとそのエラーが発生します(したがって、基本的にはコンパイルエラーではなく、実行エラーです)。

13
scbeacham

コードのこの部分は疑わしいです:

 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を読み取ろうとしますが、これは無効です。これにより、未定義の動作が発生します。これは、無効な文字列に関する誤解を招くエラーメッセージです。

これを修正するためにどのステップを実行するかを決定する必要がありますが、これが問題の直接の原因であると思います。

お役に立てれば!

12
templatetypedef

ボーンが9個ある場合は、9個ではなく8個の接続のみを印刷する必要があります。最後の接続では、bone[8]bone[9]を参照します。 bone[9]は存在しません。

2
woolstar