9

私は次のように失敗するプログラムを持っています:

terminate called after throwing an instance of 'std::bad_alloc'
  what():  St9bad_alloc

malloc/と関係があると思いますfreeが、どちらかわかりません。

スタックトレースを表示できるように、エラーでブレークするgdbセットのブレークポイントは何ですか?

このプログラムはCとC++の組み合わせであり、gcc3.4.2でコンパイルされています。

4

3 に答える 3

14

例外の原因となるのは実際にはmalloc/freeではなく、アプリケーションのC++部分に間違いなく含まれている「新しい」ものです。「新規」に割り当てるには大きすぎるパラメータを指定しているようです。

'std :: bad_alloc'は、次のコードが原因で発生します。例:

 int * p = new int[50000000];

クラッシュダンプをgdbにロードすると、バックトレースは何を示しますか?ダンプを生成できない場合は、例外がスローまたはキャッチされたときに停止するようにGDBに要求できます。残念ながら、GDBの一部のバージョンは、次の構文のみをサポートしています。

catch throw

これにより、例外がスローされたときにアプリケーションを中断できます。ただし、実行が可能である必要があることを確認するのに役立ちます

catch throw std::bad_alloc

新しいバージョンでは。

そしてそれを忘れないでください:

(gdb)キャッチを助ける

他の有用な情報の良い情報源です。

于 2009-11-02T10:03:06.903 に答える
0

これは、一部のメモリが上書きされて、メモリ割り当てシステムの状態が破損しているために発生する可能性があります(通常、メモリブロックがアプリケーションに返される前または後に保持されます)。

可能性がある場合(つまり、x86 Linuxを使用している場合)、Valgrindでプログラムを実行すると、破損が発生した場所が正確に表示されることがよくあります。

于 2009-11-02T10:01:14.360 に答える
0

存在しないファイルを読み込もうとしたときにこれが発生しました...ファイルの内容用の内部バッファーを作成しようとしましたが、ファイルが存在しなかったため、バッファーの作成が失敗しました。

int lenth_bytes;
length_bytes = in_file.tellg();
new char [length_bytes]; // length_bytes hadn't been initialised!!!!

子供を覚えておいてください。常に変数を初期化してください:Dそしてゼロの場合をチェックしてください。

于 2011-01-20T12:29:13.580 に答える