Listing 1: class MemoryAllocator

class MemoryAllocator
    {
public:
    ~MemoryAllocator ();
    MemoryAllocator (uint unit_size, uint block_size =16); 
    MemoryAllocator (uint unit_size, uint block_size, bool debug); 
    void* allocate ();
    void deallocate (void*);
    bool  is_debug () const
        { return _debug; }
private:
    struct Free
        {
        Free* next;
        };
    uint _requested_size;    // memory units requested for allocation
    uint _allocated_size;    // memory units to be allocated
    uint _block_size;        // The number of units in blocks 
    void** _allocated_blocks;    // Array of pointers to blocks
    uint _num_allocated_blocks;  // Number of allocated blocks 
    Free* _free;                 // Linked list of free units
    bool _debug;
     
    void more() throw(char*);
    void* debug_check(void*&) throw(char*); 
    void* debug_correct(void*&);
    };
     
inline
void*
MemoryAllocator::allocate()
    {
    if (!_free)
        more();
    void* storage = _free;
    _free = _free->next;
    return _debug ? debug_correct(storage) : storage;
    }
     
inline
void
MemoryAllocator::deallocate(void* storage) 
    {
    if (_debug)
        debug_check(storage);
    Free* new_free = (Free*) storage;
    new_free->next = _free;
    _free = new_free;
    }
//End of File