[解決済み】C++ エラー: 'std::bad_alloc' のインスタンスを投げた後に呼び出されたターミネート
2022-01-12 02:28:48
質問
以下の要件を実現するプログラムを書きました。
- 入力ファイルを読み込んで、その中のエントリ数をカウントする
- 適当な大きさの配列(エントリ数と同じ大きさ)を作成します。
- 入力ファイルの先頭に戻り、再度読み込む
- エントリーを配列に格納する
- ファイル内のエントリ数とエントリそのものを出力する。
以下のようなコードです。
#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つ目の穴)です。を初期化するために使用します。
length
と
size
- というのは未定義の動作です。しかし、これが単に大きな数字だと仮定しましょう - あなたは不特定のサイズ(おそらく非常に大きなサイズ)のメモリを割り当てました。
std::bad_alloc
これは、利用可能なメモリより多くのメモリを割り当てようとしたことを意味します。
また
matrix
は
VLA
のサイズが指定されていないため、非標準かつ未定義の動作となります。
関連
-
スプレッドシートに匹敵するオンライングリッドシステム。EditGrid
-
LinuxでRの新バージョンを直接コピーする方法
-
[解決済み】ValueError: shape mismatch: オブジェクトを1つの形状にブロードキャストできない
-
[解決済み】gitが「変更をコミットするか、マージする前に隠してください」と言うのを解決するにはどうしたらいいですか?
-
[解決済み】コレクションが変更され、列挙操作が実行されないことがある。
-
[解決済み】makefile:4。*** missing separator. 停止する
-
[解決済み] ポインタからキャストを使わずに整数を返す [-Wint-conversion] 戻り値の候補を作る
-
[解決済み】count()パラメータは配列かlaravelのcountableを実装したオブジェクトでなければならない。
-
[解決済み】ポインタと整数の比較を警告する
-
[解決済み] 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 実装 サイバーパンク風ボタン
おすすめ
-
linux シェル学習ノート 5日目
-
linux シェル学習ノート 2日目
-
[解決済み】C++ -- ' の前に一次式があることが予想される。
-
[解決済み] libc++abi.dylib: NSException 型のキャッチされない例外で終了する (lldb)
-
[解決済み】gitが「変更をコミットするか、マージする前に隠してください」と言うのを解決するにはどうしたらいいですか?
-
[解決済み】このリポジトリで別のgitプロセスが動作しているようです。
-
[解決済み】変数が初期化されていないかもしれないエラー
-
[解決済み】ValueError: 入力配列を形状 (224,224,3) から形状 (224,224) にブロードキャストできませんでした。)
-
[解決済み】エラー。式はintegralまたはunscoped enum型でなければなりません。
-
[解決済み】ログアウトと再ログインをせずに.bashrcの設定を再読み込みする方法とは?