web-dev-qa-db-ja.com

C ++での不正な割り当て例外

私の学校のプロジェクトで、STLを使用しないプログラムを作成するように依頼されました。
プログラムで私はたくさん使っています

Pointer* = new Something;
if (Pointer == NULL) throw AllocationError();

私の質問は割り当てエラーについてです:
1。割り当てが失敗したときにnewによってスローされる自動例外はありますか?
2。もしそうなら、STLを使用していない場合、どうすればそれをキャッチできますか(#include "exception.h
3。 NULLテストを十分に使用していますか?

ありがとうございました。
Windows 7のMinGWでeclipseCDT(C++)を使用しています。

11
CaptainNemo

はい。メモリを割り当てることができない場合、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

14
bcsanches
  1. 割り当てが失敗したときにnewによってスローされる自動例外はありますか?
  2. もしそうなら、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演算子をオーバーロードしない限り、これは必要ありません。

3
Nawaz
  1. はい:std :: bad_alloc

  2. 私の意見では、それはもはやオペレーターが新しいSTLの一部ではありません。 (あなたは捕まえることができます...しかしあなたは他の例外を除いて差別する可能性を失うでしょう)。

  3. これは不要です。newは例外をスローし、NULLを返しません。

2
AProgrammer

要求されたメモリを割り当てることができない場合、標準C++は例外をスローします。例外の代わりにNULLが必要な場合、構文は次のようになります。

Whatever *p = new (std::nothrow) Whatever;

この構文は、アロケータ関数がパラメータを受信できるようにする「プレースメント新規」割り当ての場合にすぎません。

ほとんどの場合、newの後にNULLをチェックするのはVisualC++コードであり、::operator newのデフォルトの動作は、標準で要求されるような例外を発生させるのではなく、NULLを返すことです(これはIMOは、Microsoftがポータブルコードと戦うために試みた(まだ試みているのですか?)多くの分野の1つです。

2
6502

標準のnewは、失敗するとbad_alloc例外をスローするため、nullチェックは必要ありません。

1
PaulJWilliams

古いc ++コンパイラがset_new_handlerを提供して割り当ての失敗をキャッチするかどうかに依存します。 bad_alloc例外をキャッチすることもできます。

http://en.wikipedia.org/wiki/New_%28C%2B%2B%29

これを制御したい場合は、operator new/operator deleteペアをオーバーライドすることもできます

0
VGE