class Pool {
struct Link { Link* next; }
const unsigned esize; Link* head;
Pool(Pool&); // защита от копирования void operator= (Pool&); // защита от копирования void grow(); public: Pool(unsigned n); ~Pool();
void* alloc(); void free(void* b); };
inline void* Pool::alloc() { if (head==0) grow(); Link* p = head; head = p->next; return p; }
inline void Pool::free(void* b) { Link* p = (Link*) b; p->next = head; head = p; }
Приведенные описания логично поместить в заголовочный файл Pool.h. Следующие определения могут находиться в любом месте программе и завершают наш пример. Объект Pool должен инициализироваться конструктором:
Pool::Pool(unsigned sz) : esize(sz) { head = 0; }
Функция Pool::grow() будет связывать все элементы в список квантов свободной памяти head, образуя из них новый блок. Определения остальных функций-членов оставлены в качестве упражнений 5 и 6 в §13.11.
void Pool::grow() { const int overhead = 12; const int chunk_size = 8*1024-overhead; const int nelem = (chunk_size-esize)/esize;
char* start = new char[chunk_size]; char* last = &start[(nelem-1)*esize];
for (char* p = start; p<last; p+=esize) ((Link*)p)->next = ((Link*)p)+1; ((Link*)last)->next = 0; head = (Link*)start; }