set_new_handler 関数
new.h:インデックス への移動
ヘッダーファイル
new.h
カテゴリ
メモリルーチン
構文
typedef void (new * new_handler)();
new_handler set_new_handler(new_handler my_handler);
説明
set_new_handler は,グローバルな operator new または operator new[]() が要求されたメモリを割り当てることができない場合に呼び出される関数をインストールします。new 演算子は,デフォルトでは,メモリを割り当てることができなかった場合に bad_alloc 例外を送出します。set_new_handler を呼び出して新しいハンドラを設定すると,このデフォルトの動作を変更できます。例外を送出しない new の従来のバージョンを維持するには,set_new_handler(0) を使用します。
new は,要求されたメモリを割り当てることができない場合,前回の set_new_handler の呼び出しで設定されたハンドラを呼び出します。set_new_handler によってインストールされたハンドラがない場合,new は 0 を返します。my_handler は,new がメモリの割り当て要求を満たすことができない場合に実行するアクションを指定します。new_handler 型は new.h で定義されており,引数がなく,void を返す関数です。new_handler は bad_alloc 例外を送出できます。
- ユーザー定義の my_handler は,次のいずれかを実行する必要があります。
- メモリを解放して戻る
- bad_alloc 例外または bad_alloc の派生例外を送出する
- abort または exit 関数を呼び出す
my_handler が戻った場合,new は再び要求を満たそうとします。
my_handler がメモリを解放して戻ることが理想です。そうすれば,new は要求を満たすことができ,プログラムは続行します。ただし,my_handler は,new にメモリを提供できない場合,例外を送出するか,プログラムを終了する必要があります。そうしないと,無限ループが発生します。
通常は,operator new() と operator new[]() をオーバーロードして,アプリケーションに適したアクションを実行してください。
戻り値
set_new_handler は,登録されているハンドラがあれば,それを返します。
ユーザー定義の引数関数 my_handler が値を返してはなりません。
例
#include <iostream>
#include <new.h>
#include <stdlib.h>
using std::cout;
using std::hex;
void mem_warn() {
std::cerr << "\nCan't allocate!";
exit(1);
}
void main(void) {
std::set_new_handler(mem_warn);
char *ptr = new char[100];
cout << "\nFirst allocation: ptr = " << hex << long(ptr);
ptr = new char[64000U];
cout << "\nFinal allocation: ptr = " << hex << long(ptr);
std::set_new_handler(0); // デフォルトにリセットします
}