class MemoryChunk { private: MemoryChunk* next;//指向下个内存块 void * mem;//指向可用的内存 size_t chunkSize;//该内存块的大小 size_t bytesAlreadyAllocated;//已经分配的字节数 public: MemoryChunk(MemoryChunk *nextChunk ,size_t chunkSize); ~MemoryChunk(); inline void* alloc(size_t size); inline void free (void* someElement); MemoryChunk* nextMemChunk() { return next; } size_t spaceAvailable() { return chunkSize - bytesAlreadyAllocated; } enum{ DEFUALT_CHUNK_SIZE = 4096 }; }; MemoryChunk::MemoryChunk(MemoryChunk* nextChunk, size_t reqSize) { chunkSize = (reqSize > DEFUALT_CHUNK_SIZE) ? reqSize : DEFUALT_CHUNK_SIZE; next = nextChunk; bytesAlreadyAllocated=0; mem= new char [chunkSize]; } MemoryChunk::~MemoryChunk() { delete [] (char*)mem; } void* MemoryChunk::alloc(size_t requestSize) { void* addr = (void* )((size_t )mem + bytesAlreadyAllocated ); bytesAlreadyAllocated+=requestSize; return addr; } inline void MemoryChunk::free(void* someElement ) {} //内存池类 class ByteMemoryPool { private: MemoryChunk* listOfMemoryChunks; void expandStorage(size_t reqSize); public: ByteMemoryPool(size_t initSize = MemoryChunk::DEFUALT_CHUNK_SIZE); ~ByteMemoryPool(); inline void* alloc(size_t size); inline void free(void* someElement); }; ByteMemoryPool::ByteMemoryPool(size_t initSize) { listOfMemoryChunks=NULL; expandStorage(initSize); } ByteMemoryPool::~ByteMemoryPool() { MemoryChunk* memChunk = listOfMemoryChunks; while(memChunk) { listOfMemoryChunks = memChunk->nextMemChunk(); delete memChunk; memChunk = listOfMemoryChunks; } } inline void* ByteMemoryPool::alloc(size_t requestSize) { size_t space = listOfMemoryChunks->spaceAvailable(); if(space<requestSize) { expandStorage(requestSize); } return listOfMemoryChunks->alloc(requestSize); } inline void ByteMemoryPool::free(void* doomed) { listOfMemoryChunks->free(doomed); } void ByteMemoryPool::expandStorage(size_t requestSize) { listOfMemoryChunks = new MemoryChunk(listOfMemoryChunks,requestSize); } //调用类 class Rational { private: int n; int d; static ByteMemoryPool* memPool; public: Rational(int a=0, int b=1):n(a),d(b){} void* operator new (size_t size){ return memPool->alloc(size); } void operator delete (void* doomed, size_t size){ memPool->free(doomed); } static void newMemPool(){ memPool = new ByteMemoryPool; } static void deleteMemPool(){ delete memPool; } }; ByteMemoryPool* Rational::memPool=0; int main() { Rational * array[1000]; Rational::newMemPool(); for(int j=0;j<500;j++) { for(int i=0;i<1000;i++) { array[i]=new Rational(i); } for(int i=0;i<1000;i++) { delete array[i]; } } Rational::deleteMemPool(); return 0; }