Listing 2

template <class Super>
struct UseSizeHeap : public Super {
  static size_t getSize(const void * ptr) {
    return ((freeObject *) ptr - 1)->sz;
  }
protected:
  union freeObject {
    size_t sz;
    double _dummy; // for alignment.
  };
};

template <class SuperHeap>
class SizeHeap
    : public UseSizeHeap<SuperHeap> {
  typedef typename
    UseSizeHeap<SuperHeap>::freeObject
      freeObject;
public:
  void * malloc(const size_t sz) {
    // Add room for a size field.
    freeObject * ptr = (freeObject *)
      SuperHeap::malloc(sz +
        sizeof(freeObject));
    // Store the requested size.
    ptr->sz = sz;
    return (void *) (ptr + 1);
  }
  void free(void * ptr) {
    SuperHeap::free((freeObject *)ptr - 1);
  }
};