オーバーロードするnewとdeleteをクラスのメンバ関数として定義すれば、そのクラスをnewやdeleteしたときのみオーバーロードしたもので行うようにすることができる。
#include <iostream> using namespace std; class Test { public: void *operator new(size_t size); void operator delete(void *p); }; void *Test::operator new(size_t size) { cout << "overload new\n"; void *p; p = malloc(size); if(!p) { bad_alloc ba; throw ba; } return p; } void Test::operator delete(void *p) { cout << "overload free\n"; free(p); } void main() { Test* pTest; Test* pTest2; pTest = new Test; pTest2 = new Test[10]; delete pTest; delete[] pTest2; }
実行結果
overload new overload free
このプログラムでは配列のnewとdeleteはオーバーロードしてないため、配列の場合は通常のnew,deleteが使われる。