2016-12-18 8 views
0

STLを使用して数字の大きなコンテナを使用するプログラムがあります。時にはvector、時にはdequeとなります。場合によっては大きなvectorを直接構築することもありますが、小さなサイズで開始し、次にresizeを使用して拡大することもあります。STLが「bad_alloc」例外をスローすると、メモリリークが発生しますか?

コンストラクタresizeは、「bad_alloc」例外をスローします。またはdeque私の質問は、ここにメモリリークがありますか? メモリリークがなければ、私はまだ続けるかもしれません。しかし、もしあれば、物事は面倒です。

私のシステムはWindows 7 64ビット、Visual Studio 2013、および32ビットプログラムで動作します。

+0

FYI:http://stroustrup.com/except.pdf –

+0

@NickyCあなたのポイントは何ですか? – athos

+0

@PaulRooneyええ、メモリが不足していますが、STLコンテナの 'constructor'や' resize'中に 'new'や' malloc'が使われていると仮定していますので、STLから 'bad_alloc'が投げられるとSTLは記憶部分?メモリリークはありますか? – athos

答えて

1

スローstd::bad_alloc例外は、メモリリークがあるというわけではありません。これは、オペレータnewまたはオペレータnew[]を使用した動的割り当てが失敗したことを意味します。標準コンテナタイプ(std::Vectorstd::list、など)で使用される

デフォルトのアロケータは、通常、オペレータnewまたはnew[]を使用するので、彼らが失敗した場合も、std::bad_allocを投げることができます。

メモリリークはメモリ枯渇の原因の1つに過ぎず、newまたはnew[]を使用してメモリを動的に割り当てることができない可能性があります。

一般に、std::bad_allocがスローされた場合、メモリの割り当てに失敗した(割り当てを解除する必要はありません)ことを意味します。だから、漏れはありません。いくつかのオブジェクト(またはクラス)が実装されていないと、例外がスローされた場合にメモリリークが発生する可能性があります。規格は、ベクトルの要素が適切な保証を提供していると仮定して、それを防止する標準コンテナの要件を記述する。

+0

新しいオペレータの設計がうまくいかないと、メモリがリークする可能性があります。 'new'オブジェクトと' new'ログ項目を作成した新しい演算子を想像してみましょう。新しい2番目の呼び出しは失敗し、最初のオブジェクトが漏れてしまいます。OPとは無関係だと思うが、他の人にとってはおそらく有用だと私は認めている。 –

+0

@Zekian - そうではありません。割り当てに失敗すると、以前に正常に割り当てられたオブジェクトを解放するために 'new'式は必要ありません。これらのオブジェクトを追跡し、適切な 'delete'式を使用してそれらを解放するのは、呼び出し側の責任です。 – Peter

+0

私の声明は、カスタムが新しいものを実装する人への警告です。 –

-1

std::bad_allocnewまたはnew[]がメモリ割り当てに失敗した場合にスローされます。

メインメモリが不足している可能性がありますか?あなたは特に構造new int[1024*1024*1024];を割り当てようとしたかもしれませんか?ヒープが断片化している可能性があります(多くの割り当てと削除)ので、必要なサイズのメモリが連続して割り当てられませんでした。

関連する問題