new 演算子が新しいオブジェクトを作成すると、この演算子は、operator new() また
は operator new[]() 関数
を呼び出して、必要なストレージを獲得します。
new は、新しいオブジェクトを作成するためのストレージを割り振りできないときに は、set_new_handler() への呼び出しに よって new ハンドラー 関数 (インストールされている場合) を 呼び出します。std::set_new_handler() 関数は、ヘッダー <new> で宣言されます。 この関数を使用して、定義済みの new ハンドラーまたは デフォルトの new ハンドラーを呼び出します。
new ハンドラーは、次のうちのどれかを実行する必要があります。
set_new_handler() 関数には、以下のプロトタイプがあります。
typedef void(*PNH)(); PNH set_new_handler(PNH);
set_new_handler() は、引き数として関数 (new ハンドラー) を指すポインターを取ります。 この関数には引き数がなく、void を戻します。set_new_handler() は、直前の new ハンドラー関数を 指すポインターを戻します。
独自の set_new_handler() 関数を指定しない場合は、 new は、型 std::bad_alloc の例外をスローします。
次のプログラムでは、new 演算子がストレージを割り振りできない場合に、 set_new_handler() を使用してメッセージを戻す方法を示します。
#include <iostream> #include <new> #include <cstdlib> using namespace std; void no_storage() { std::cerr << "Operator new failed: no storage is available.¥n"; std::exit(1); } int main(void) { std::set_new_handler(&no_storage); // Rest of program ... }
new がストレージを割り振りできないためにプログラムが失敗した場合は、プログラ ムは次のメッセージを出して終了します。
Operator new failed: no storage is available.
関連参照