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;