07項 メモリ不足に備えよう
"メモリ不足に備えよう"
メモリ割り当て失敗時の対応を、set_new_handler()で定義できます。
set_new_handler()を使うためには、new.hをinculdeします。
set_new_handler()を使いセットされた関数は、メモリ割り当て失敗時に毎回呼び出されます。
しかし、newをオーバロードすることによって、クラス別のset_new_handler()を定義できます。
#include <iostream> #include <Windows.h> #include <new.h> void noMemory() { std::cout << "class C bad_alloc\n"; MessageBoxA(NULL, "", "", 0); abort(); } class C { public: static void* operator new(size_t size) { defaultHandler = set_new_handler(&noMemory); originalHandler = set_new_handler(defaultHandler); set_new_handler(originalHandler); void *alloced = ::operator new(size); set_new_handler(defaultHandler); return alloced; } private: static new_handler defaultHandler; static new_handler originalHandler; }; new_handler C::defaultHandler; new_handler C::originalHandler; int main() { for(int i=0; i<0x7FFFFFFE; i++) { C *p = new C; } while(1); return 0; }
上の例では、割り当て失敗時、標準出力に"class C bad_alloc\n"を表示し、メッセージボックスでプログラムを待ち状態にしています。その後abort()を呼び出して強制終了します。
実行結果