ガベージコレクタでは、classに対してdeleteを使わない同等の処理が必要になる。
case1とcase2は同じであるが、case2ではデストラクタを取り出し、外側からデストラクトしている。


#define GC_NEW(T) new(GCAllocate::GC_new( sizeof(T) ))T
typedef void (*destroy)(void*);

int _tmain(int argc, _TCHAR* argv[])
{
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); // leak check

// case1: 普通
MyClass* p1 = new MyClass("test");
delete p1;


// case2: GC(GarbageCollection)を使う場合
destroy hakaider = GCAllocate::destructor::destroy;

MyClass* p2 = GC_NEW(MyClass)("test"); // 内部はmalloc
void* ptr = p2;
hakaider(ptr); // call destructor!
free(p2);

return 0;
}


ハカイダーのようなバイクを乗り回すヒーロー物の元祖は東映の「不良番長シリーズ」らしい。


// まだ何もできていないGarbageCollection
class GCAllocate
{
public :
static void* GC_new( UINT size )
{
UINT nsz = size + sizeof(GCMHeader);

void* p = ::malloc(nsz);

GCMHeader* u = (GCMHeader*)p;
....

void* p2 =(void*)(u + 1);
memset( p2, 0, size );
return p2;

}

template
struct destructor
{
static void destroy(void* obj) { static_cast(obj)->~T(); } // { delete static_cast(obj); }
};
};