1. ホーム
  2. c++

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

2022-02-02 02:18:33

質問

以下の作業を記載されている順に実行するために、以下に貼り付けたコードを書きました。

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

.cppファイルを実行すると、エラーメッセージがずっと表示されます。

std::bad_alloc' のインスタンスをスローした後に呼び出されるターミネート
what(): std::bad_alloc
中止(コアダンプ)

これは、メモリ不足や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 のサイズが指定されていないため、非標準かつ未定義の動作となります。