//new5.cpp
#include <iostream.h>
#include <fstream.h>

class MyClass	{
   int a;
   char b;
public:
	//provide our own allocation/deallocation mechanisms
   void* operator new(size_t sz);
   void operator delete(void* addr, size_t);
};

const int CacheSize = 5;
int top=-1;
char buffer[CacheSize][sizeof(MyClass)];
void* MyClass::operator new(size_t sz)	{
   cout << "MyClass::operator new(size_t sz=" << sz << ")" << endl;
   if (++top >= CacheSize)	{
	cerr << "out of memory\n";
	top -= 1;
	return 0;
   }
   else	{
	return &buffer[top];
   }
}
void MyClass::operator delete(void* addr, size_t)	{
   cout << "MyClass::operator delete(void* addr=" << hex << addr << endl;
	//we only give it back if it is the top one
   if (addr == &buffer[top])	{
	top -= 1;
	}
}
void main()	{
   MyClass *mine[6];
   for(int i=0;i<6;i++)	{
	mine[i] = new MyClass;
   }
   for(i=4;i>=0;i--)	{
	delete mine[i];
   }
   mine[0] = new MyClass;
   mine[1] = new MyClass;
   mine[2] = new MyClass;
}
/****************************************************
MyClass::operator new(size_t sz=3)
MyClass::operator new(size_t sz=3)
MyClass::operator new(size_t sz=3)
MyClass::operator new(size_t sz=3)
MyClass::operator new(size_t sz=3)
MyClass::operator new(size_t sz=3)
out of memory
MyClass::operator delete(void* addr=0x397f0b30
MyClass::operator delete(void* addr=0x397f0b2d
MyClass::operator delete(void* addr=0x397f0b2a
MyClass::operator delete(void* addr=0x397f0b27
MyClass::operator delete(void* addr=0x397f0b24
MyClass::operator new(size_t sz=3)
MyClass::operator new(size_t sz=3)
MyClass::operator new(size_t sz=3)
****************************************************/


