2016-10-08 21 views
1

のインスタンスを投げた後に呼び出さ終了し、私は彼らが計上された順序で次のタスクを実行するには、以下の貼り付けコードを書いた:C++エラーは:「のstd :: bad_alloc」

  1. 入力ファイルを読み、その内のエントリの数をカウントすることは
  2. (エントリの数に等しいサイズ)適切なサイズの配列
  3. は、入力ファイルの先頭に戻り、配列
  4. に再び
  5. ストアエントリをそれを読むの作成します
  6. ファイル内のエントリ数とエントリ自体を表示します。ここで

私のコードです:

#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ファイルを実行すると:

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

を、私は、これはメモリ不足に関係しています集まりましたmain()関数から抜け出した変数がありますが、この特定の状況でどのように問題に対処するのか分かりません。それが適切であれば、私はLinuxコンピュータで作業しています。


第一ホール:int numEntries

+3

プログラムは未定義の動作を示します。 'numEntries'は決して初期化されません。それはランダムなゴミを含んでいます - おそらく非常に大きな数です。 –

+0

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

+0

頻繁にデータを初期化できない場合は、Windows/Visual Studioに切り替える必要があります。 Visual Studioには静的なコード分析機能があり、この種のバグを簡単にキャッチします。 – IInspectable

答えて

1

このコードは、3つの穴を有しています。後で行う:++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例外です。つまり、利用可能なメモリをさらに割り当てたいということです。

また、matrixは、指定されていないサイズのVLAです。これは、非標準と未定義の両方の動作です。

関連する問題