简易内存池

#include

/*
new
1.开辟内存
2.初始化
delete
1.释放资源
2.释放内存
/
/

new
1.开辟内存
operator new 系统
2.调用构造函数
delete
1.调用析构函数
2.释放对象的内存
operator delete 系统
*/

/*
自主的内存管理机制 :通过对new,delete进行重载来实现。
*/

/*
系统允许new,delete进行重载
/
template
class Queue
{
public:
Queue()
{
pfront = ptail = new QueueItem();//使用带头节点的单链表实现头插,统一操作,方便,浪费一个结点问题不大
}
~Queue()
{
QueueItem
pCur = pfront;
QueueItem* pNext;
while(pCur != NULL)
{
pNext = pCur -> pnext;
delete pCur;
pCur = pNext;
}
pfront = ptail = NULL;
}
void push(T val)
{
QueueItem* pnewitem = new QueueItem(val);
ptail -> pnext = pnewitem;
ptail = ptail -> pnext;
}
bool emtpy()
{
return (ptail == pfront) && (pfront != NULL);
}
void pop()
{
if(emtpy())
{
throw std::exception(“Queue is empty!”);
}
QueueItem* pdelete = pfront -> pnext;
pfront -> pnext = pdelete -> pnext;
delete pdelete;
}
T front()
{
if(emtpy())
{
throw std::exception(“Queue is empty!”);
}
return pfront -> pnext -> mdata;
}
T back()
{
if(emtpy())
{
throw std::exception(“Queue is empty!”);
}
return ptail -> mdata;
}
private:
class QueueItem
{
public:
QueueItem(T val = T())
:mdata(val),pnext(NULL)
{}
void * operator new (size_t size)
{
if(poor == NULL)//没有空间的话进行申请,最后一个内存片指针域置为NULL
{
poor =(QueueItem*) new charsize * 10;//将10次内存(系统)申请变成1次和 10次(用户)
QueueItem* pcur = poor;
for(pcur;pcur < poor + 10 - 1;pcur = pcur + 1)//参考静态链表
{
pcur -> pnext = pcur + 1;
}
pcur -> pnext = NULL;
}
QueueItem* rt = poor;//以头删的方式对外提供空间
poor = poor -> pnext;
return rt;
}
void operator delete (void* ptr)
{
if(ptr == NULL)return ;
QueueItem* pptr = (QueueItem*) ptr;//采取头插的方式
pptr -> pnext = poor;
poor = pptr;
}
public:
T mdata;
QueueItem* pnext;
};
QueueItem* pfront;
QueueItem* ptail;
static QueueItem* poor;
};

template
typename Queue::QueueItem* Queue::poor = NULL;

int main()
{
Queue que;

for (int i = 0; i < 3; i++)
{
	que.push(i + 1);
}

int rt = que.front();
que.pop();

std::cout << "rt:" << rt << std::endl;
return 0 ;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值