問題タブ [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.
c++ - std::bad_alloc 参照のアドレスからポインタを割り当てる
なんらかの理由で、次のようなコードになりました
bad_alloc
これにより、割り当ての時点で例外がスローされます。なんで?f
キャストされていないベクトルで呼び出されたことは重要ですか? これは gcc 4.1 でコンパイルされた C++03 です。
**編集**これは、例外が表示されるGoogleモック内で実行されているコード内にあります。コードを切り離して個別にコンパイルしようとしたところ、うまくいきました。さらに見る
** さらに編集 ** したがって、問題は実際には、それ自体が別のオブジェクトのメンバーであるオブジェクトのコンストラクターの最後の行で割り当てが発生したことでした。親オブジェクトのイニシャライザ リストの次のオブジェクトは、例外が発生した場所でしたが、gdb は、この割り当てが行われた前のオブジェクトのコンストラクタの最後の行で発生しているように見せかけました。質問がいかに見当違いであったかを思い出させるために、すべての反対票をありがとう。
c++ - 動的メモリ割り当てを含む関数に noexcept の注釈を付けないでください。
通常は絶対に失敗しない関数があるとします。たとえば、次のようになります。
原則として、これは の候補になりnoexcept
ます。ただし、実装には動的メモリ管理が含まれる可能性が最も高いため、演算子でメモリを割り当てるときに常にstd::bad_allocnew
をスローする可能性があります。
関数に noexcept のアノテーションを付けることをお勧めしますか?
実際的な観点からは、メモリ不足の状況を合理的な方法で処理することは非常に困難です。ほとんどのプログラムは、十分なメモリが利用可能であると想定しています。関数が をスローstd::terminate
した場合に発生するように、 を呼び出すことは、その場合は合理的であるように思われます。noexcept
std::bad_alloc
私にとってnoexcept
は、ある種のドキュメントです。ユーザー (またはオプティマイザー) が、この関数が決してスローしないと安全に想定できるという約束です。メモリ不足の状況を気にしないアプリケーションをプログラミングしている場合でも、それは有効な仮定です。
最も安全な推奨事項は、例外がスローされる可能性があるnoexcept
場合は使用しないことだと思います。std::bad_alloc
一方で、noexcept
メモリ不足の状況を気にしない (つまり、std::terminate
OK の場合) と仮定すると、とにかく使用する利点があるかどうか疑問に思います。
c++ - ポインタによるメモリ割り当ての失敗
有名な「std::bad_alloc」のエラーについて調べてみましたが、私のようなケースは見つかりませんでした。私はc ++でコードを実装しました(正確には、Win 7 Prof.のEclipseを使用してMinGWで実行しています)。コードは少数のクラスインスタンスでうまく動作しますが、クラスインスタンスの数が10509を超えると、からのエラーウィンドウが表示され、Eclipse で「std::bad_alloc」エラーが表示されます。「new」を使用して新しいクラスインスタンスを構築しています。各クラスには、2 つのポインターと、「long int」、「string」、および「int」型の 3 つの変数が必要です。後でノードとしてプログラムの他の部分で評価する必要があるため、以前にビルドされたインスタンスを分解することはできません。しかし、とにかくクラス定義にクラスデコンストラクターを追加しましたが、それらは確実に適切に設定されています。
新しいクラスインスタンスを割り当てるために予約メモリを拡張できるかどうか疑問に思っていますか?
コードが長すぎてここに貼り付けられません。助けてくれてありがとう!
c++ - C++ ベクトル std::bad_alloc エラー
ベクトル リストにノードを追加するときに、C++ でサフィックス ツリーを実装しようとしています。ツリーに 3 番目の要素を追加した後、std::bad_alloc がスローされます。3 回目以降に発生する理由がわかりません。この bad_alloc エラーの解決を手伝ってもらえますか?
これが私のコードです:
suffix_tree.cpp
ノード.cpp
node.h
メイクファイル
前もって感謝します。
c++ - dbx を使用して AIX で C++ 例外をキャッチする
AIX マシン上の特定の入力データに対して「不正な割り当て」エラー メッセージで終了する C++ アプリケーションがあります。
プログラムを dbx で実行し、スローされたときに例外をキャッチする方法はありますか? IBM のドキュメントには、それについて何も表示されません。
c++ - new が原因の C++ bad_alloc?
[前注: StackOverflow の既存のスレッドを読みました。私の質問には誰もいなかったようです]
Quake 2 MD2 形式を検討しています。ポインター配列を新規作成した後、割り当てがうまくいかないようです。ただし、ひどいポインター操作を行っても、すべて問題ありません。問題は、なぜこのような例外が発生するのかということだと思います。
最初の「MD2Model::Load」が機能します。例外が発生した後に投稿したもの。
基本構造 :
そして今、.md2 ファイルを読み取る関数:
デバッグ中にダンプされる変数:
(最終的には D3DXVECTOR3 構造体を削除して確認したので、ちょっと厄介です..)
大丈夫。そのため、'for' ループの内部で爆発します。私がこのようにそれを行うとしたら:
「m_pFrames[i].pVerts」ステートメントの割り当て中に bad_alloc 例外が発生します。取得できない場合もありますが、D3D クラスを新しくしようとすると例外が発生します (後で何を新しくしても取得されると想定しています)。MEM の使用率が非常に低いので、ヒープが破損している可能性がありますか?
アニメーション中にも VertexBuffer を作成しているときに、実際にこれを行う必要がありました。
最終的にベクターを使用する必要がありますか? 彼らが必要以上に割り当てていることは知っていますが、それは(最も明白な)[最良の]方法のようです。
c++ - std::map::begin() はゴミを含むイテレータを返します
const_iterator termWeight の作成時に問題が発生します。
上の画像でわかるように、termWeight const_iterator には無効なデータがあります。ただし、const std::map ドキュメントは完全に有効な std::map です。これが起こっている理由は考えられません。
最近 std::map::cbegin() が存在することを知りました。代わりにその方法を使用する必要がありますか?
編集:より多くのコンテキストが含まれています
c++ - std::sort を使用した非常に小さな std::vector に対して std::bad_alloc 例外をスローする C++
コンマ区切りデータ (CSV) を扱う C++ のプロジェクトに取り組んでいます。私がしているのは、.csv ファイルから CsvRow オブジェクトのベクトルにデータを読み取ることです。
それで、今日、私は本当に奇妙な std::bad_alloc 例外がはるかに奇妙な状況でスローされることに遭遇しました。つまり、例外がスローされるまでもう少し時間を確保できた最初のテスト ケースは、csv ファイル全体をベクターに読み込むことでした。ファイルは 500,000 行で構成され、そのサイズは約 70MB です。ファイルは魅力のようにメモリに読み込まれましたが、ソート手順の数秒後に std::bad_alloc がスローされます。約 67MB の RAM を使用しました。注: メモリ消費を抑えるために、boost の flyweights を使用しています。
しかし、このテスト ケースはさらに奇妙でした。数百行の 146KB のファイルを読み込んでいるのですが、今回はデータをベクトルに読み込んでいるときに例外が発生しました。
メモリ リークの疑いがありますが、私のマシンには 8 GB の RAM があり、64 ビット Windows 8 を使用しています。CodeBlocks と MinGW 64 ビット ブースト ディストリビューションを使用しています。どんな助けでも大歓迎です。std::bad_alloc がスローされているコードのチャンクを次に示します。
csv ファイルからのデータの読み取り
/li>クラスに格納されている内部構造体を使用してベクトルを並べ替える
/li>
次に、std::sort()
CsvRows のベクトルを並べ替えるために使用しています
この行は非常に疑わしいように見えますが、これらのハッシュ セットを初期化する簡単な方法を見つけることができませんでした。
デストラクタでこれらのハッシュ セットを削除すると、プログラム (SIGSEGV) がクラッシュします。もう 1 つ注意すべき点は、MinGW が 64 ビットであるため、デフォルトの 32 ビット gdb デバッガを使用できないことです。32 ビット gdb にはバグがあり、MinGW 64 では動作しません。
編集:
CsvRow boost::flyweight<std::string>
クラスで使用する は問題を引き起こす可能性がありますか?
それに加えて、CsvRow
クラスの一部を次に示します。
クラス のオーバーロード[]
された演算子:CsvRow
前もって感謝します
編集 -
解決済み:この質問は私の問題を解決しましたが、考えもしませんでした。に渡すすべてのカスタム コンパレータはstd::sort()
、厳密な弱い順序付けである必要があります。つまり、
1. 非反射
2. 非対称
3. 推移性
4. 非比較性の推移性
詳細: This question and This Wiki article
実際、私は最初のもの (非反射性) には従いませCsvRow
んでしtrue
た。代わりに返品してfalse
ください。CsvRow a
とCsvRow b
が等しい場合にのみデフォルトの戻り値を変更することで、問題全体を解決しました。
助けようとしたすべての人に感謝します。同様の問題が発生した場合に備えて、この解決策を覚えておいてください。それはかなりトリッキーです。