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()を呼び出して強制終了します。

実行結果
f:id:skru_y:20131031122605j:plain