09項 普通の形式のnewを隠蔽しないように注意しよう

"普通の形式のnewを隠蔽しないように注意しよう"


下のようなパラメータを増やしたnewを定義したときなどに、newが隠蔽され通常のnewが呼び出せなくなることがあります。

class C
{
public:
	static void *operator new(size_t size, new_handler p)
	{
		set_new_handler(p);
		return ::operator new(size);
	}
};


int main()
{
	
	C *p = new C; //エラー、関数に 1 個の引数を指定できません。


対策として、デフォルト引数を使う方法、通常のnewを別に定義する方法があります。
デフォルト引数を使う方法

class C
{
public:
	static void *operator new(size_t size, new_handler p=0)
	{
		if(p != 0)
			set_new_handler(p);
		return ::operator new(size);
	}
};


int main()
{
	
	C *p = new C;

通常のnewを別に定義する方法

class C
{
public:
	static void *operator new(size_t size, new_handler p)
	{
		set_new_handler(p);
		return ::operator new(size);
	}
	static void *operator new(size_t size)
	{
		return ::operator new(size);
	}
};


int main()
{
	
	C *p = new C;