問題タブ [bad-alloc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
201 参照

c++ - メモリが使用可能になるまで待機する nothrow new はありますか?

この質問を読む前は、例外処理を真剣に考えたことがありませんでした。今では必要性を感じていますが、それでも「例外セーフなコードを書くのは非常に難しい」と感じています。

その質問の受け入れられた回答でこの例を参照してください。

答えが言うように、私は を使用することで簡単に基本的な保証を提供できますstd::unique_ptr。ただし、 a をキャッチすると、それがorstd::bad_allocで発生するかどうかがわからないため、 t.list がまだ「良好」なのか、それとも最後の要素が完全に準備されていないのかはわかりません。その場合、唯一の選択肢は、t がプログラム全体に不可欠である場合、t を破棄し、恐ろしいメッセージを表示して中止することです。push_backx->doSomethingThatCanThrow()

強力な保証を持つコードには問題はありませんが、「コストが高くなる可能性があり」(この例では大きなリストのコピーが含まれます)、それほど読みにくくなります。

可能な解決策はnew、メモリが利用可能になるまで待機させ、最も厄介な例外を削除することですstd::bad_alloc。次に、 2. と 3. はスローしません (Xの構築とコピーが常に成功する場合)。4. を try ブロックでラップし、ここで例外を処理する (そしてリストを pop_back する) ことができます。次に、関数は非スロー保証を提供し、リストには常に良いものが含まれます。

ユーザーは、100% の CPU と 100% の RAM の違いを気にしません。プログラムがハングするのを見ると、他のプログラムを閉じて、new十分なメモリを見つけて続行します。

私の質問: これは実装できますか? メモリが使用可能になるまで待機する nothrow new はありますか? #define new ...C++ が標準化される前のライブラリが一時的な 100% RAM に耐えられるように、グローバルに (たとえば によって) 適用できますか?

0 投票する
0 に答える
682 参照

c++ - gdb "引数の末尾がジャンクです。" 「catch throw std::bad_aloc」を試みるとき

gdb で std::bad_alloc のインスタンスをデバッグしようとしています。

gdb 7.4.1および7.5.91で試しました

std::bad_alloc を一重引用符と二重引用符で囲んでみましたが、成功しませんでした。

これに対する回避策、または bad_alloc をキャッチする別の方法はありますか?

編集:関連する質問からの提案を試して、 bad_alloc のコンストラクターを壊してみました

しかし、このブレークポイントは見つかりませんでした。

0 投票する
0 に答える
250 参照

c++ - オブジェクト コピー ビジュアル スタジオ エラー ポップアップ: std::bad_alloc

ページの内容を別の Page オブジェクトにコピーしたいと考えています。ただし、エラーがあります。メモリ割り当てに関連していると思います。特定の理由は見つかりませんでした。誰か理由について説明してくれませんか?対処オブジェクトのソース コード部分を添付しました。感謝

mlock.c ファイル エラー ポイント void __cdecl _unlock (int locknum) { /* * クリティカル セクションを離れます。*/ LeaveCriticalSection( _locktable[ロック番号].lock ); Microsoft C++ 例外: std::bad_alloc(メモリ位置 0x002afa90)

0 投票する
1 に答える
3892 参照

c++ - 不正な割り当てがスローされます

ブースト マネージド共有メモリを使用しようとしているときに、「bad_alloc」が発生します。せっかちな人向けのクイック ガイドからブーストの例をコピーし、独自の変更を組み込みました。私のコードは以下のとおりです。例をコメントアウトし、その下に自分のコードを書きました。また、デバッグとテスト用のものもいくつか入れました。

誰にもアイデアはありますか?どんな助けでも大歓迎です!

-M

}

そして、ここに私のプログラム出力があります...

0 投票する
1 に答える
2014 参照

c++ - 奇妙な std::bad_alloc

私の知る限り、std::bad_alloc がスローされる理由は 3 つあります。

  1. プロセスは、提供できるよりも多くのメモリを要求しています
  2. アドレス空間が断片化されすぎているため、連続したメモリの大きなチャンクに対する要求を処理できません
  3. ヒープ管理データ構造が壊れています

std::bad_alloc に実行されるコードがありますが、上記の理由のいずれも当てはまらないようです。データ構造は、頂点の std::list として格納されるグラフであり、各頂点は、それが含まれるエッジの std::list と、ある程度の連続データを格納します。

小さなグラフ (<= 100'000 頂点) の場合、プログラムは頂点ごとのデータ セクションの大きさに関係なく完全に正常に実行されます (合計で最大 40 GB を問題なく割り当てることができます)。ただし、頂点の数が増えると、8 GB のメモリしか使用しないインスタンスでも std::bad_alloc 例外がスローされます。

より大きなブロックに多くのメモリを割り当てても問題ないため、上記の理由 1. および 2. は除外する必要があります。非常にエラーが発生しやすい方法でポインターをいじるセクションがあるため、ヒープ データ構造が破損する可能性があります。しかし、小さなインスタンスで実行すると、valgrind の memcheck はコードに問題がないと報告するため、その理由もありそうにありません (インスタンスをスローすると、valgrind 自体がメモリ不足になるため、そのケースを直接確認することはできません)。

この動作の理由として他に何が考えられるか、または問題をさらに突き止めるためにどのようなテストを実行できるかについてのアイデアはありますか?

OS: Fedora 19
ビルドシステム: cmake with gcc 4.8.2

0 投票する
1 に答える
7558 参照

c++ - `std::vector` は、サイズ変更時に「不正な割り当て」例外をスローします

JNIを介して呼び出すC++ dllに次のコードがあります。

ベクトルの最大サイズが 10000000 より大きいと思われるにもかかわらず、「不適切な割り当て」例外が発生します。

メモリ リークを特定するためにメモリ割り当てを追跡するには、どのツールを使用すればよいですか?

メモリ リークが本当にない場合、十分なスペースを確保するために、ベクターのフットプリントを減らすにはどうすればよいですか?

0 投票する
0 に答える
596 参照

c++ - スマート ポインターに関する std::bad_alloc の問題

スマート ポインターを使用して、コースの割り当てのために潜在的に大きなデータ要素を並べ替えて再リンクしようとしています。以下に示すように、コードでスマート ポインターのクラスを定義しました。

並べ替えようとしているオブジェクトは、個人的な記録 (名前、電話番号など) を持つクラス オブジェクトを含む単一リンク リストです。以下に示すように、片方向リスト クラスには iterator クラスがあります。

以下は、スマート ポインターを使用して "並べ替え" を行うためのリスト クラス内の関数です。

tl;dr、このコードはコンパイルされるため、どこかに不適切なスマート ポインターの割り当てが必要ですが、実行するとコア ダンプと共に std::bad_alloc が発生します。どこでメモリリークしていますか? よろしくお願いします。

PS、私はすでにここでスマートポインターをさらに調査しており、この実装が割り当ての要件でない場合は、標準ライブラリのスマートポインターを使用します。また、std::sort(begin, end) への呼び出しがコメントアウトされていることはわかっていますが、スマート ポインターが適切な場所に移動するまで、並べ替えを開始したくありませんでした。

0 投票する
0 に答える
159 参照

c++ - ベクトルからの取得時の std::bad_alloc

(ここで質問したことがないので、礼儀正しくなかったらすみません)

私は GLWidget で使用するシーン グラフに取り組んでおり、bad_alloc の奇妙なケースに遭遇しています。シーン グラフの各ノード (graphNode と呼ばれる) には、次のフィールドがあります。

(myPolygon は、頂点と色のデータを格納するために作成したカスタム ポリゴン クラスです)

私の SceneGraph クラスには次のフィールドがあります。

allNodes をビルドしようとすると、bad_alloc が発生します。私のルート ndoe には 5 つの子があり、std::cout を使用して子ベクトルのサイズを出力すると、5 になります。ただし、各子を allNodes にプッシュしようとすると、std::bad_alloc エラーが発生します。QT での正確なアプリケーション出力は

特に、プログラムが子が存在することを認識しているため、何が間違っているのかわかりません (そして、print ステートメントとデバッガーを使用してステップスルーすると、子がすべて期待どおりであることがわかります。コードを提供する必要がある場合は、喜んで提供します。

編集:誰かが尋ねたので、基本的に次のように文字を作成するコードがあります:

Node Root: name "root" polygon = 胴体の四角形 graphNode* 親 = 5 つの子の NULL ベクトル [Head、Arm1、Arm2、Leg1、Leg2]

Node Head: name "head" polygon = 頭の円 graphNode* 親 = 空の子ベクトルのルート

ノード Arm1 名 "arm1" ポリゴン = 上腕の長方形 graphNode* 親 = 1 つの子のルート ベクトル [Forearm1]

ノード Arm2 名 "arm2" ポリゴン = 上腕の長方形 graphNode* 親 = 1 つの子のルート ベクトル [Forearm2]

ノード Leg1 名 "leg1" ポリゴン = 太ももの四角形 graphNode* 親 = 1 つの子のルート ベクトル [Loweleg1]

ノード Leg2 名 "leg2" ポリゴン = 太ももの四角形 graphNode* 親 = 1 つの子のルート ベクトル [Loweleg2]

Node Forearm1 name "forearm1" polygon = 前腕の四角形 graphNode* 親 = Arm1 空の子ベクトル

ノード Forearm2 name "forearm2" polygon = 前腕の四角形 graphNode* 親 = Arm2 空の子ベクトル

ノード Lowerleg1 name "lowerleg1" polygon = カーフ グラフの長方形Node* 親 = Leg1 空の子ベクトル

ノード Lowerleg2 name "lowerleg2" polygon = カーフグラフの長方形 Node* 親 = Leg2 空の子ベクトル

0 投票する
1 に答える
110 参照

c++ - C++ (STL を使用) のグラフを含む大規模なテストケースで std::bad_alloc がスローされる

以下を格納する必要があるグラフ (隣接リストの実装として格納) アルゴリズムの実装に取り​​組んでいます。

  1. 距離の 2 次元 n 対 n 行列 (float の配列として格納)
  2. 頂点の各ペア間の最短パスの数 (整数の配列として格納)。
  3. ソースのすべての可能な選択について、ソース頂点として特定の頂点を取るすべての頂点の先行。これは O(n*n*k) です。ここで、k はソース頂点のすべての可能な選択に対するすべての頂点の先行オブジェクトの平均数です。最悪の場合、これは最大 O(n^3) スペースになる可能性があります。ただし、先行者の平均数は少ない可能性があります (k は定数です)。先行は、2 レベルのマップとして格納され、先行のリストは STL ベクトルとして格納されます。

大きなグラフ (>2^12 頂点) でテストを試みましたが、しばらく実行すると std::bad_alloc がスローされます。これは、3GB のメモリのみを使用して 8GB (Ubuntu 12.04) または 16GB で実行した場合でも当てはまります。大規模なテスト ケースを機能させる方法を教えてください。