ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

newとdeleteのオーバーロードその2

オーバーロードする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が使われる。