ユーザーは、クラス・メンバー関数またはグローバル・ネーム・スペース関数としての、
ユーザー自身の new 演算子あるいは割り振り関数を、以下の制限の下で定義することができます。
ユーザーは、ユーザー自身の delete 演算子、 あるいはクラス・メンバー関数またはグローバル・ネーム・スペース関数としての割り振り解除関数を、 以下の制限の下で定義することができます。
次の例では、グローバル・ネーム・スペース new および delete の置換関数を定義しています。
#include <cstdio> #include <cstdlib> using namespace std; void* operator new(size_t sz) { printf("operator new with %d bytes¥n", sz); void* p = malloc(sz); if (p == 0) printf("Memory error¥n"); return p; } void operator delete(void* p) { if (p == 0) printf ("Deleting a null pointer¥n"); else { printf("delete object¥n"); free(p); } } struct A { const char* data; A() : data("Text String") { printf("Constructor of S¥n"); } ~A() { printf("Destructor of S¥n"); } }; int main() { A* ap1 = new A; delete ap1; printf("Array of size 2:¥n"); A* ap2 = new A[2]; delete[] ap2; }
次に、上記の例の出力を示します。
operator new with 40 bytes operator new with 33 bytes operator new with 4 bytes Constructor of S Destructor of S delete object Array of size 2: operator new with 16 bytes Constructor of S Constructor of S Destructor of S Destructor of S delete object
関連参照