割り振り関数および割り振り解除関数

C++ユーザーは、クラス・メンバー関数またはグローバル・ネーム・スペース関数としての、 ユーザー自身の 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

関連参照

IBM Copyright 2003