私の学校のプロジェクトで、STLを使用しないプログラムを作成するように依頼されました。
プログラムで私はたくさん使っています
Pointer* = new Something;
if (Pointer == NULL) throw AllocationError();
私の質問は割り当てエラーについてです:
1。割り当てが失敗したときにnewによってスローされる自動例外はありますか?
2。もしそうなら、STLを使用していない場合、どうすればそれをキャッチできますか(#include "exception.h
)
3。 NULLテストを十分に使用していますか?
ありがとうございました。
Windows 7のMinGWでeclipseCDT(C++)を使用しています。
はい。メモリを割り当てることができない場合、new演算子は自動的に例外をスローします。
コンパイラがなんらかの方法で無効にしない限り、new演算子がNULLポインタを返すことはありません。
bad_alloc
例外をスローします。
また、使用できるnewのnothrow
バージョンがあります。
int *p = new(nothrow) int(3);
このバージョンは、メモリを割り当てることができない場合、nullポインタを返します。ただし、オブジェクトのコンストラクターは引き続き例外をスローする可能性があるため、これは100%nothrow
を保証するものではないことにも注意してください。
もう少し情報: http://msdn.Microsoft.com/en-us/library/stxdwfae(VS.71).aspx
- 割り当てが失敗したときにnewによってスローされる自動例外はありますか?
- もしそうなら、STLを使用していない場合、どうすればそれをキャッチできますか(#include "exception.h)
はい。この例を参照してください。また、例外をキャッチする方法も示しています。
try
{
int* myarray= new int[10000];
}
catch (bad_alloc& ba)
{
cerr << "bad_alloc caught: " << ba.what() << endl;
}
ここから: http://www.cplusplus.com/reference/std/new/bad_alloc/
3。 NULLテストを十分に使用していますか?
new
演算子をオーバーロードしない限り、これは必要ありません。
はい:std :: bad_alloc
私の意見では、それはもはやオペレーターが新しいSTLの一部ではありません。 (あなたは捕まえることができます...しかしあなたは他の例外を除いて差別する可能性を失うでしょう)。
これは不要です。newは例外をスローし、NULLを返しません。
要求されたメモリを割り当てることができない場合、標準C++は例外をスローします。例外の代わりにNULLが必要な場合、構文は次のようになります。
Whatever *p = new (std::nothrow) Whatever;
この構文は、アロケータ関数がパラメータを受信できるようにする「プレースメント新規」割り当ての場合にすぎません。
ほとんどの場合、new
の後にNULLをチェックするのはVisualC++コードであり、::operator new
のデフォルトの動作は、標準で要求されるような例外を発生させるのではなく、NULLを返すことです(これはIMOは、Microsoftがポータブルコードと戦うために試みた(まだ試みているのですか?)多くの分野の1つです。
標準のnewは、失敗するとbad_alloc例外をスローするため、nullチェックは必要ありません。
古いc ++コンパイラがset_new_handlerを提供して割り当ての失敗をキャッチするかどうかに依存します。 bad_alloc例外をキャッチすることもできます。
http://en.wikipedia.org/wiki/New_%28C%2B%2B%29
これを制御したい場合は、operator new
/operator delete
ペアをオーバーライドすることもできます