首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++内存池 析构出有关问题

2012-09-27 
C++内存池 析构出问题。这是《efficient C++》里面的一个例子。。关于内存池的。。。C/C++ code#include stdafx.h

C++内存池 析构出问题。
这是《efficient C++》里面的一个例子。。关于内存池的。。。

C/C++ code
#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;}


应该是这里挂掉了
MemoryPool<T>::~MemoryPool()
{
MemoryPool<T>* nextPtr=next;
for(nextPtr=next;nextPtr!=NULL;nextPtr=next)
{
next=next->next;
delete[] nextPtr;
}
}

 此处断言失败 _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
但是找了好久还是不知道怎么错了,望各路大神指导啊!!


[解决办法]
看下这个吧:
与你一样的问题:
http://topic.csdn.net/u/20070528/13/23201f49-f6a6-482f-815b-523251d42577.html

[解决办法]
试试看:

C/C++ code
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]    }} 

热点排行
Bad Request.