■
ガベージコレクタでは、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); }
};
};