2017-02-02 10 views
0

私は10,000行のコードを読み込むプログラムを作っています。私はvectorのunordered_mapを持っていて、各行はその新しい配列にデータを追加します(新しいキーの形式か、ベクトルの1つに追加のデータを追加します)。unordered_mapsとベクトルのstd :: bad_allocを防ぐのに役立つ良い方法は何ですか?

各行について、私はemplaceを使用してデータを保存しています。例えば、私は私が

temp.push_back(someInt); 

を使用してデータを保存し、その後

uList.emplace(someKey, temp); 
temp.clear(); 

と私のunordered_mapにそのベクトルを格納したり、私は1つにデータを追加

vector <int> temp; 

を持っていますを用いて地図ベクトルのうちのいずれかを選択する。

uList[i].push_back(someInt); 

これは1行に複数回発生し、次の行に移動して何度も何度もやり直します。

私が手にエラーが

私はそれが原因で私のunordered_mapかでメモリを割り当てる問題のだと仮定してい

「『のstd :: bad_alloc』のインスタンスを投げた後に呼び出さを終了」であります私が持っているベクトル。

私の質問:unordered_mapは.emplace()を何度も使用するとメモリ割り当てに問題があり、ベクトルや順序付けられていないマップの不正な割り当てを防ぐための一般的な方法はありますか?

何か愚かな助けをする私に私を呼び出すことさえ助言してくれます!

+0

あなたは一時的な名前をつけたので、 'std :: move(temp)'を使いたいかもしれません。デフォルトではC++はそこから移動しません。これはまた、移動されたベクトルを「クリア」する必要がないことを意味する。 – MSalters

答えて

1

bad_allocを取得している理由を知るには十分だとは思いません。通常、それは単にあなたが記憶を使い果たしたことを意味します。

私の最初の考えは、あなたが思う以上に多くを配分しているという論理的な問題があるということです。私はまた、順序付けされていないマップに対して生成されたハッシュが貧弱であるかどうか、既存の要素のリストを更新するのではなく、より多くの要素を挿入するかどうか疑問に思います。

私の提案:より完全なサンプルを投稿するか、デバッグ/トレースを追加して、データ構造内に作成され格納されているアイテムの数を確認してください。

また、終了する前にプロセスが消費しているメモリ量はどれくらいですか?仮想メモリを搭載したオペレーティングシステム上で実行されている最近の(特に64ビット)プロセスでは、これに失敗する前にかなりの量を割り当てることができます。 32ビットの制限に達する可能性は高くなりますが、それでもなお重要です。

+0

ありがとうございます、私はより完全なサンプルをまとめようとします。それは32ビットです。 私は順序付けられていないマップであまり経験がありません。それは、私が使用するもう1つの空のベクトルに加えて、各行の番号を格納するベクトルを持つ私と関係があります。emplace()を使用して、順序付けられていないマップに要素を追加します。このマップには、最終的に600要素のような複数のベクトルが格納されます。 –

関連する問題