問題タブ [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++ - c++ stl プライオリティ キュー挿入 bad_alloc 例外
私は、メモリからドキュメント ID の長いリストを読み取り、一致する ID を探すクエリ プロセッサに取り組んでいます。見つかった場合は、docid (int) とドキュメントのランク (double) を含む DOC 構造体を作成し、それを優先キューにプッシュします。私の問題は、検索された単語に長いリストがある場合に、DOC をキューにプッシュしようとすると、次の例外が発生することです。 :bad_alloc メモリ位置 0x0012ee88..
単語に短いリストがある場合、うまく機能します。コードのいくつかの場所で DOC をキューにプッシュしようとしましたが、それらはすべて特定の行まで機能します。その後、上記のエラーが発生します。読み込まれた最長のリストが 1 MB 未満であり、割り当てたすべてのメモリを解放しているため、何が問題なのか完全に途方に暮れています。DOC を保持する容量のあるキューに DOC をプッシュしようとすると、突然 bad_alloc 例外が発生するのはなぜですか?
このような質問は、すべてのコードを見ないと答えられないことはわかっていますが、ここに投稿するには長すぎます。私はできる限り多くのことを書いていますが、誰かが私に答えてくれることを切望しています。
NextGEQ 関数は、docid の圧縮ブロックのリストをブロックごとに読み取ります。つまり、ブロック内 (別のリスト内) の最後の docid が、渡された docid よりも大きいことがわかった場合、ブロックを解凍し、正しいものが見つかるまで検索します。各リストは、圧縮された各チャンクの長さとチャンク内の最後の docid を含むリストに関するメタデータで始まります。data.query は、メタデータの先頭を指します。data.metapointer は、関数が現在あるメタデータ内の任意の場所を指します。また、data.blockpointer は、圧縮されていない docid のブロックの先頭を指します (存在する場合)。すでに解凍されていることがわかった場合は、検索するだけです。以下では、関数を初めて呼び出すと、ブロックが解凍され、docid が検索されます。その後のキューへのプッシュは機能します。2回目はありません」解凍する必要さえありません。つまり、新しいメモリは割り当てられませんが、その後、キューにプッシュすると bad_alloc エラーが発生します。
編集:コンパイルできるように、コードをさらにクリーンアップしました。OpenList() 関数と NextGEQ 関数も追加しましたが、後者は長いですが、問題はそのどこかでヒープの破損が原因であると思われるためです。どうもありがとう!
どうもありがとう、bsg。
c++ - マージソート-ベクトルを割り当てようとしたときにスローされるstd::bad_alloc
こんにちは、ご列席の皆様。ですから、それは私の間違いの日ではありません。C ++でマージソート(インプレースではない)を実装しているのですが、コードに本当に問題があり、理由がわかりません。関数の最後から2番目の行は、mergeSort()
の結果merge()
をintのベクトルに割り当てますresult
。この行(関数ではなく実際の割り当て)はbad_alloc
エラーをスローしますが、その理由はわかりません。
インターネットは、これは主にメモリ不足エラーが原因でスローされることを示唆してbad_alloc
いますが、最初に呼び出されたのは500 intのベクトルであるため、これは当てはまりません。 32ビット整数で2Kb?)私はC++に対して愚かで間違ったことをしていると思いますが、何が起こっているのかわかりません。what()
例外を呼び出してみましたが、名前が返されます。コード:
関数を書き直して、merge
関数の参照を取得してresult
編集するだけで問題なく動作しますが、コードをマージソート用に指定された「標準」の疑似コードにできるだけ近づけたいと思いました。
助けてくれてありがとう。
c++ - std::bad_alloc を手動でスローしても問題ありませんか?
私はこのコードを持っています..
関係のない情報のほとんどを省略しましたが、ここで全体像は明らかだと思います。
すべてのレイヤー作成を個別に試行/キャッチし、bad_allocs を再スローする前にログに記録する代わりに、手動で std::bad_alloc をスローしても問題ありませんか?
c++ - std :: bad_allocをスローした場合、newはNULLへのポインターを設定しますか?
失敗した場合にnew(std::no_throw)
ポインタを設定することを知っています。また、通常は失敗した場合に例外をスローするNULL
ことも知っています。new
std::bad_alloc
法線は、それがスローした場合にnew
もポインタを設定しますか?NULL
またはNULL
、catch()
ブロック内で設定する必要がありますか?
c++ - クラス Texture で new を呼び出すときの bad_alloc
これは問題のある行です:
Texture *texture = new Texture (...);
ここでbad_allocから受け取ります:
サイズは最大 28 バイトです
これまでのところ、プログラムは 32 ビット システム (フレッシュ リブート) のヒープにおそらく 2 MB を配置しましたが、これまでは約 20 個しかヒープに割り当てられていなかったため、ヒープの破損がないことがわかりました。
私は困惑している...
c++ - 派生クラスのC++配列と派生オブジェクトへの基本クラスのポインターの配列 - 割り当てられるメモリの量がそれほど異なるのはなぜですか?
よくわからない問題について説明が必要です。以下の 2 つのシナリオを使用すると、割り当てられるメモリの量はほぼ同じになると考えられます。ただし、シナリオ 2 ではbad_alloc
しばらくすると例外が発生し、狂ったようにメモリを食いつぶしているように見えます (プロセスに割り当てられたメモリ量のプロキシとして Windows のタスク マネージャを使用します)。以下は、MSVC10 を使用して Windows 32 ビットでコンパイルされます。
次の基本クラスがあるとします。
さて、派生クラスについては:
ここで、2 つのケースを考えてみましょう。まず、Derived クラスの動的配列を割り当て、Derived オブジェクトで埋めます。つまり、次のようになります。
次に、Base クラスのポインターの動的配列を割り当て、Derived クラスの実際のインスタンスを指すようにします。つまり、次のようになります。
どちらのシナリオでも SOME_LARGE_NUMBER を 40,000,000 に設定しました。最初のシナリオでは、プログラムは問題なく完了します。2 番目のシナリオでは、bad_alloc 例外が発生します。これは予想される動作なのか、それともここで何かを見落としているのか疑問に思っています。もしそうなら、これを行うより良い方法は何ですか? vector<Base<int>*>
と を使用しても同じ問題が発生することに注意してくださいboost::ptr_vector<Base<int>>
。
c++ - std::vector に構造体を追加するときの std::bad_alloc
これはおそらくばかげたことですが、私には理解できません。std::bad_alloc
次のコード スニペット (スイッチの case ステートメント) で例外が発生します。
TheStack
はタイプでMyStack
あり、これはtypedef std::vector<MyStackItem> MyStack;
MyStackItem
は単純な構造で、次のようになります。
MyNode
nadに関してMyPrimitiveNode
は、それらは別のプロジェクト (静的ライブラリ) から来ており、次のように定義されています。
これが必要なすべての関連情報であることを願っています。MyStackItem は浅いコピーのみを行うことを知っています。これが私が望む方法です。リークについては心配しないでください。それは他の場所で処理されます。
誰かが私に何が起こっているのか、どうすれば修正できるのか教えてもらえますか? ありがとう。
編集:スタックトレースを投稿すると役立つ場合があります:
c++ - MySQL C++ コネクタのメモリ オーバーフロー エラー
MySQL/C++ Connector パッケージを使用して、ローカルでホストされている自分の MySQL データベースに接続しようとしています。本当に問題を引き起こしている行は次のとおりです。
2 行の 2 行目にヒットすると、メモリ割り当てエラーが発生します。デバッガーからの読み出しは次のとおりです。
何が間違っているのか本当にわかりません。接続ポインタそのものではないかと思ったので、今ご覧のauto_ptrに変換してみました。同じエラー。connect 関数にさまざまなパラメーターを試してみましたが、それも問題ではないようです。プログラムの早い段階でメモリリークの問題が発生する理由を誰か説明できますか?
c++ - std::bad_alloc が呼び出しスタックフレームに引っかからない
new 演算子がメモリの割り当てに失敗した場合、 new ステートメントをすぐに囲む try-catch ブロックを配置した場合にのみ、例外 std::bad_alloc がキャッチされます。代わりに、数スタックフレーム下の呼び出し元に try-catch ブロックがある場合、そこでキャッチされず、異常なプログラム終了が発生します。なぜこれが起こるのですか?これは Microsoft Visual Studio 2008 上にあります。
編集:OK、これは機能していないコードです。すぐ下の関数は new を呼び出している場所で、その下の関数はその下のスタックフレームです。最後の関数は、catch 句がある場所ですが、そこでキャッチされません。
また、bad_alloc をキャッチしたときのスタックフレーム (新しいステートメントをすぐに囲む catch 句内) は次のとおりです。
c++ - なぜこれでbad_allocエラーが発生するのですか?
現在、cinから文字列を読み取り、この関数の引数として使用され、データを使用してStudentオブジェクトを作成するStudentのメンバー関数を設定しようとしています。しかし、それは私にbad_allocエラーを与えていますか?関数が文字列を取得していることは知っていますが、新しいオブジェクトが作成された後、このエラーが発生します。
エラー:
コンストラクタ:
働き:
testStudent.cpp: