問題タブ [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 投票する
4 に答える
2660 参照

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。

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

c++ - マージソート-ベクトルを割り当てようとしたときにスローされるstd::bad_alloc

こんにちは、ご列席の皆様。ですから、それは私の間違いの日ではありません。C ++でマージソート(インプレースではない)を実装しているのですが、コードに本当に問題があり、理由がわかりません。関数の最後から2番目の行は、mergeSort()の結果merge()をintのベクトルに割り当てますresult。この行(関数ではなく実際の割り当て)はbad_allocエラーをスローしますが、その理由はわかりません。

インターネットは、これは主にメモリ不足エラーが原因でスローされることを示唆してbad_allocいますが、最初に呼び出されたのは500 intのベクトルであるため、これは当てはまりません。 32ビット整数で2Kb?)私はC++に対して愚かで間違ったことをしていると思いますが、何が起こっているのかわかりません。what()例外を呼び出してみましたが、名前が返されます。コード:

関数を書き直して、merge関数の参照を取得してresult編集するだけで問題なく動作しますが、コードをマージソート用に指定された「標準」の疑似コードにできるだけ近づけたいと思いました。

助けてくれてありがとう。

0 投票する
4 に答える
24397 参照

c++ - std::bad_alloc を手動でスローしても問題ありませんか?

私はこのコードを持っています..

関係のない情報のほとんどを省略しましたが、ここで全体像は明らかだと思います。

すべてのレイヤー作成を個別に試行/キャッチし、bad_allocs を再スローする前にログに記録する代わりに、手動で std::bad_alloc をスローしても問題ありませんか?

0 投票する
2 に答える
828 参照

c++ - std :: bad_allocをスローした場合、newはNULLへのポインターを設定しますか?

失敗した場合にnew(std::no_throw)ポインタを設定することを知っています。また、通常は失敗した場合に例外をスローするNULLことも知っています。newstd::bad_alloc

法線は、それがスローした場合にnewもポインタを設定しますか?NULLまたはNULLcatch()ブロック内で設定する必要がありますか?

0 投票する
3 に答える
960 参照

c++ - クラス Texture で new を呼び出すときの bad_alloc

これは問題のある行です:

Texture *texture = new Texture (...);

ここでbad_allocから受け取ります:

サイズは最大 28 バイトです

これまでのところ、プログラムは 32 ビット システム (フレッシュ リブート) のヒープにおそらく 2 MB を配置しましたが、これまでは約 20 個しかヒープに割り当てられていなかったため、ヒープの破損がないことがわかりました。

私は困惑している...

0 投票する
5 に答える
1723 参照

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>>

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

c++ - std::vector に構造体を追加するときの std::bad_alloc

これはおそらくばかげたことですが、私には理解できません。std::bad_alloc次のコード スニペット (スイッチの case ステートメント) で例外が発生します。

TheStackはタイプでMyStackあり、これはtypedef std::vector<MyStackItem> MyStack;

MyStackItemは単純な構造で、次のようになります。

MyNodenadに関してMyPrimitiveNodeは、それらは別のプロジェクト (静的ライブラリ) から来ており、次のように定義されています。

これが必要なすべての関連情報であることを願っています。MyStackItem は浅いコピーのみを行うことを知っています。これが私が望む方法です。リークについては心配しないでください。それは他の場所で処理されます。

誰かが私に何が起こっているのか、どうすれば修正できるのか教えてもらえますか? ありがとう。

編集:スタックトレースを投稿すると役立つ場合があります:

0 投票する
2 に答える
2198 参照

c++ - MySQL C++ コネクタのメモリ オーバーフロー エラー

MySQL/C++ Connector パッケージを使用して、ローカルでホストされている自分の MySQL データベースに接続しようとしています。本当に問題を引き起こしている行は次のとおりです。

2 行の 2 行目にヒットすると、メモリ割り当てエラーが発生します。デバッガーからの読み出しは次のとおりです。

何が間違っているのか本当にわかりません。接続ポインタそのものではないかと思ったので、今ご覧のauto_ptrに変換してみました。同じエラー。connect 関数にさまざまなパラメーターを試してみましたが、それも問題ではないようです。プログラムの早い段階でメモリリークの問題が発生する理由を誰か説明できますか?

0 投票する
2 に答える
1680 参照

c++ - std::bad_alloc が呼び出しスタックフレームに引っかからない

new 演算子がメモリの割り当てに失敗した場合、 new ステートメントをすぐに囲む try-catch ブロックを配置した場合にのみ、例外 std::bad_alloc がキャッチされます。代わりに、数スタックフレーム下の呼び出し元に try-catch ブロックがある場合、そこでキャッチされず、異常なプログラム終了が発生します。なぜこれが起こるのですか?これは Microsoft Visual Studio 2008 上にあります。

編集:OK、これは機能していないコードです。すぐ下の関数は new を呼び出している場所で、その下の関数はその下のスタックフレームです。最後の関数は、catch 句がある場所ですが、そこでキャッチされません。

また、bad_alloc をキャッチしたときのスタックフレーム (新しいステートメントをすぐに囲む catch 句内) は次のとおりです

0 投票する
3 に答える
4952 参照

c++ - なぜこれでbad_allocエラーが発生するのですか?

現在、cinから文字列を読み取り、この関数の引数として使用され、データを使用してStudentオブジェクトを作成するStudentのメンバー関数を設定しようとしています。しかし、それは私にbad_allocエラーを与えていますか?関数が文字列を取得していることは知っていますが、新しいオブジェクトが作成された後、このエラーが発生します。

エラー:

コンストラクタ:

働き:

testStudent.cpp: