您的位置:首页 > 编程语言 > C语言/C++

c++内存池

2016-01-29 11:34 337 查看
//以下是一个简易的c++内存池的实现。实现次内存池的目的是我们一次性向系统申请大块的内存,然后自己管理,这样可以避免重复向系统申请小块的内存而带来的系统开销。

我是用一个双端队列来管理申请到的内存的。当程序需要申请是,从队头拿出来一个。释放时,将释放的内存块挂进队列。以下是c++代码。



const int MEM_SIZE = 5;

class CQueue

{

public:
CQueue()
{
mpfront = new CQueueNode;
mprear = mpfront;
}
void AddNode(int data)
{
CQueueNode *ptmp = new CQueueNode(data);
mprear->pnext = ptmp;
mprear = ptmp;
}
void DelNode()
{
if(IsEmpty())
{
return ;
}
CQueueNode *ptmp = mpfront->pnext;
if(ptmp->pnext ==NULL)
{
mprear = mpfront;
}
mpfront->pnext = ptmp->pnext;
delete ptmp;

}

bool IsEmpty()
{
return mpfront==mprear;
}

private:
class CQueueNode
{
public:
CQueueNode(int data=0):mdata(data),pnext(NULL){}
~CQueueNode(){}
int mdata;
CQueueNode *pnext;
static CQueueNode *memcurnode;

void *operator new(size_t size);
void operator delete(void *ptr);
};
CQueueNode *mpfront;
CQueueNode *mprear;
friend ostream& operator<<(ostream &,CQueue &);

};

CQueue::CQueueNode * CQueue::CQueueNode::memcurnode = NULL;

void * CQueue::CQueueNode::operator new(size_t size)

{
CQueueNode *ptmp = NULL;
if(memcurnode==NULL)
{
size_t allocsize = MEM_SIZE*size;
memcurnode = (CQueueNode *)new char[allocsize];
ptmp = memcurnode;
for(;ptmp<memcurnode+MEM_SIZE-1;++ptmp)
{
ptmp->pnext = ptmp+1;
}
ptmp->pnext = NULL;
}
ptmp = memcurnode;
memcurnode = ->pnext;
return ptmp;

}

void CQueue::CQueueNode::operator delete(void *ptr)

{
if(ptr==NULL)
{
return ;
}
CQueueNode *ptmp=(CQueueNode*)ptr;
ptmp->pnext=memcurnode;
memcurnode=ptmp;

}

ostream& operator<<(ostream &out,CQueue &rhs)

{
CQueue::CQueueNode *ptmp = rhs.mpfront->pnext;
while(ptmp!=NULL)
{
cout<<ptmp->mdata<<" ";
ptmp=ptmp->pnext;
}
cout<<endl;
return out;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: