// this is based on item 10 from Scott Meyers "Effective C++" #include #include #include using namespace std; class AirplaneRep { protected: string _name; long _weight; public: static long count; AirplaneRep( const std::string& name="", long weight=0) : _name( name), _weight(weight) { count ++; } void Name( const string& name) { _name = name; } const string& Name() const { return _name; } void Weight( long weight) { _weight = weight; } const long Weight() const { return _weight; } virtual ~AirplaneRep() { count--; } }; long AirplaneRep::count; class Airplane : public AirplaneRep { private: AirplaneRep *rep; static Airplane *headOfFreeList; public: void *operator new( size_t size) throw(); void operator delete( void *deadObject, size_t size); Airplane( const std::string& name="", long weight=0) : AirplaneRep( name, weight) { } }; Airplane *Airplane::headOfFreeList = 0; void *Airplane::operator new(size_t size) throw() { if (size != sizeof(Airplane)) { return ::new char[size]; } Airplane *p = headOfFreeList; if (p) headOfFreeList = (Airplane*)p->rep; else { Airplane *newBlock = (Airplane *) ::new(std::nothrow) char[256*sizeof(Airplane)]; if (newBlock==0) return 0; int i; for (i=0; i<255; i++) { newBlock[i].rep = (AirplaneRep*) &newBlock[i+1]; } newBlock[i].rep = 0; p = newBlock; headOfFreeList = &newBlock[1]; } return p; } void Airplane::operator delete (void* deadObject, size_t size) { if (size != sizeof(Airplane)) { ::delete [] ((char*)deadObject); return; } Airplane *carcass = (Airplane*) deadObject; carcass->rep = (AirplaneRep*) headOfFreeList; headOfFreeList = carcass; } int main() { long i; Airplane *ap[100]; for (i=0;i<100;i++) { ap[i] = new Airplane(); cout << "count = " << AirplaneRep::count << endl; } for (i=0;i<100;i++) { delete ap[i]; cout << "count = " << AirplaneRep::count << endl; } return 0; }