C++内存池 析构出问题。
这是《efficient C++》里面的一个例子。。关于内存池的。。。
#include "stdafx.h"#include<iostream>#include<boost/timer.hpp>using namespace boost;template<typename T>class MemoryPool{public: MemoryPool(size_t size=EXPANSION_SIZE); ~MemoryPool(); void *alloc(size_t size); void free(void *someElement);private: MemoryPool<T>* next; enum{EXPANSION_SIZE=32}; void expandTheFreeList(int howMany=EXPANSION_SIZE);};template<typename T>MemoryPool<T>::MemoryPool(size_t size){ expandTheFreeList(size);}template<typename T>MemoryPool<T>::~MemoryPool(){ MemoryPool<T>* nextPtr=next; for(nextPtr=next;nextPtr!=NULL;nextPtr=next) { next=next->next; delete[] nextPtr; }}template<typename T>void *MemoryPool<T>::alloc(size_t size){ if(!next) { expandTheFreeList(); } MemoryPool<T>* head=next; next=head->next; return (void*)head;}template<typename T>void MemoryPool<T>::free(void* doomed){ MemoryPool<T>* head=static_cast<MemoryPool<T>*>(doomed); head->next=next; next=head;}template<typename T>void MemoryPool<T>::expandTheFreeList(int howMany){ size_t size=(sizeof(T)>sizeof(MemoryPool<T>*))?sizeof(T):sizeof(MemoryPool<T>*); MemoryPool<T>* runner=(MemoryPool<T>*)(new char[size]); next=runner; for(int i=0;i<howMany;++i) { runner->next=reinterpret_cast<MemoryPool<T>*>( new char[size]); runner=runner->next; } runner->next=NULL;}class Rational{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 MemoryPool<Rational>; } static void deleteMemPool() { delete memPool; }private: int n; int d; static MemoryPool<Rational> *memPool;};MemoryPool<Rational>* Rational::memPool=0;int _tmain(int argc, _TCHAR* argv[]){ Rational* array[1000]; Rational::newMemPool(); timer t; for(int j=0;j<1;j++)//设得小主要为了调试方便,下同 { for(int i=0;i<1;++i) { array[i]=new Rational(i); } for(int i=0;i<1;++i) { delete array[i]; } } std::cout<<t.elapsed(); Rational::deleteMemPool();//运行到此挂掉 system("pause"); return 0;}template<typename T>MemoryPool<T>::~MemoryPool(){ MemoryPool<T>* nextPtr=next; for(nextPtr=next;nextPtr!=NULL;nextPtr=next) { next=next->next; [color=#FF0000] delete[] (char*)nextPtr;[/color] }}