1. ホーム
  2. スクリプト・コラム
  3. その他

[解決済み】C++ エラー: 'std::bad_alloc' のインスタンスを投げた後に呼び出されたターミネート

2022-01-12 02:28:48

質問

以下の要件を実現するプログラムを書きました。

  1. 入力ファイルを読み込んで、その中のエントリ数をカウントする
  2. 適当な大きさの配列(エントリ数と同じ大きさ)を作成します。
  3. 入力ファイルの先頭に戻り、再度読み込む
  4. エントリーを配列に格納する
  5. ファイル内のエントリ数とエントリそのものを出力する。

以下のようなコードです。

#include <iostream>
#include <fstream>
#include <exception>

using namespace std;

int main(int argc, char* argv[]){

    ifstream inFile(argv[1]); //passing arguments to the main function
    int numEntries;

    if(!inFile){
        cout << "file not found" << endl;
        return 1;
    }

    string entry;
    while (!inFile.eof()){ //counting the number of entries
        getline(inFile,entry);
        ++numEntries;
    }

    const int length = numEntries;  //making an array of appropriate length
    int*arr = new int[length];

    inFile.clear();             //going back to the beginning of the file
    inFile.seekg(0, ios::beg);

    int i = 0;
    const int size = numEntries;    //making an array to store the entries in the file
    int matrix[size];
    int pos = 0;

    int variable = 0;
    while(pos < size){
        inFile >> variable;
        matrix[pos] = variable;
        ++pos;
    }
    cout<< numEntries << "entries have been read"<< endl; 
    inFile.close();
    for(int i = 0; i < pos; ++i)
        cout << matrix[i] << endl; //printing out the entries
    return 0;
}

実行すると、エラーが発生します。

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

これは、メモリ不足やmain()関数から変数が落ちることと関係があると推測していますが、この具体的な状況での対処法が分かりません。関連性があるとすれば、私はLinuxのコンピュータで作業しています。

解決方法を教えてください。

このコードには3つの穴があります。


1つ目の穴 int numEntries . 後でする。 ++numEntries;

不特定の値をインクリメントしています。UBかどうかはわからないが、それでも悪い。


2ホール目、3ホール目。

const int length = numEntries;
int* arr = new int[length];

そして

const int size = numEntries;
int matrix[size];

numEntries は不特定値(1つ目の穴)です。を初期化するために使用します。 lengthsize - というのは未定義の動作です。しかし、これが単に大きな数字だと仮定しましょう - あなたは不特定のサイズ(おそらく非常に大きなサイズ)のメモリを割り当てました。 std::bad_alloc これは、利用可能なメモリより多くのメモリを割り当てようとしたことを意味します。

また matrixVLA のサイズが指定されていないため、非標準かつ未定義の動作となります。