1. ホーム
  2. c++

[解決済み] エラー「'std::length_error' what(): basic_string::_S_create Aborted のインスタンスを投げた後に呼ばれた terminate (コアダンプ)」を理解する"

2022-01-26 19:51:46

質問

そこで、私のエラーを紹介します。

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++でコンパイルはできますが、実行するとこのエラーが出ます(つまり、基本的にはコンパイルエラーではなく、実行エラーです)。

解決方法は?

この部分のコードが怪しい。

 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を読もうとしますが、これは有効ではありません。この結果、未定義の動作となり、あなたの場合、無効な文字列に関する誤解を招くエラーメッセージが表示されます。

どのような手順で修正するかはご自身で決めていただくとして、私はこれが直接的な原因だと考えています。

お役に立てれば幸いです。