[解決済み] C++エラー:'std::bad_alloc'のインスタンスを投げた後にterminateが呼び出された
2022-02-02 02:18:33
質問
以下の作業を記載されている順に実行するために、以下に貼り付けたコードを書きました。
- 入力ファイルを読み込んで、その中のエントリ数をカウントする
- 適当な大きさの配列(エントリ数と同じ大きさ)を作成します。
- 入力ファイルの先頭に戻り、再度読み込む
- エントリーを配列に格納する
- ファイル内のエントリ数とエントリそのものを出力する。
以下は私のコードです。
#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つ目の穴)です。を初期化するために使用します。
length
と
size
- というのは未定義の動作です。しかし、これが単に大きな数字だと仮定しましょう - あなたは不特定のサイズ(おそらく非常に大きなサイズ)のメモリを割り当てました。
std::bad_alloc
これは、利用可能なメモリより多くのメモリを割り当てようとしたことを意味します。
また
matrix
は
VLA
のサイズが指定されていないため、非標準かつ未定義の動作となります。
関連
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】Enterキーを押して続行する
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み] std::stringのインスタンスを小文字に変換する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された