内存池

内存池_第1张图片

内存池_第2张图片

结合链式队列实现简单的内存池

#include
using namespace std;
const int MEM_POOL_SIZE = 10;

template
class Queue
{
public:
	Queue()
	{
		pfront = prear = new QueueItem();//头指针尾指针都指向头结点
	}
	//队列特点:从队尾进,从队头出
	void push(T val)//将val插入队列,尾插
	{
		QueueItem *pnode = new QueueItem(val);//开辟结点,放入val
		prear->pnext = pnode;
		prear = prear->pnext;
	}
	void pop()
	{
		if (!IsEmpty())
			//在此判空,是为了防止pfront->pNext指向野指针(已被删除的结点)
		{
			QueueItem *pcur = pfront->pnext;
			pfront->pnext = pcur->pnext;
			delete pCur;
		}
	}
	T front()//获取队头元素
	{
		if (!IsEmpty())
		{
			return pfront->pnext->mdata;
		}
	}
	T back()//获取队尾元素
	{
		if (!IsEmpty())
		{
			return prear->mdata;
		}
	}
	~Queue()
	{
		QueueItem *pCur = pfront;
		QueueItem *pnext = pfront;//保存当前要释放的结点的下一结点
		while (pCur != NULL)
		{
			pnext = pCur->pnext;//保存下一结点
			delete pCur;//释放当前结点
			pCur = pnext;//当前结点指向下一结点
			pfront = prear = NULL;
		}
	}
private:
	bool IsEmpty()
	{
		return pfront == prear;
	}
	class QueueItem	//结点类
	{
	public:
		QueueItem(T val = T()) :mdata(val), pnext(NULL){}
		void* operator new(size_t size)//size为开辟的一个结点的大小
		{
			//pool指针指向的内存池中没有内存,则开辟内存
			//第一次开辟,第二次不开辟,直接从pool内存池中拿数据
			if (pool == NULL)
			{
				pool = (QueueItem*)new char[size *MEM_POOL_SIZE]();
				//等号左右两边类型不匹配,需要强转
			}
            //以静态链表的方式维护内存池
			//初始化
			QueueItem *pCur = pool;
			for (pCur; pCurpnext = pCur + 1;
			}
			pCur->pnext = NULL;//最后一个指针域置为空
			//返回内存共使用
			QueueItem* rt = pool;//pool为第一个数据结点
			pool = pool->pnext;//pool->pNext 下一个数据节点
			return rt;
		}
		void operator delete(void *ptr)
		{
			if (ptr == NULL)
			{
				return;
			}
			QueueItem* p = (QueueItem*)ptr;
			p->pnext = pool;//把结点插入静态链表中
			pool = p;
		}
	public:
		T mdata;//数据域
		QueueItem *pnext;//指针域
		static QueueItem *pool;
		// 使用static关键字是因为所有的结点使用的是同一个未使用的指针
	};
	QueueItem* pfront;//队头指针
	QueueItem* prear;//队尾指针
};
//静态成员变量必须在类外进行初始化
template
typename Queue::QueueItem* Queue::QueueItem::pool = NULL;
//typename 必须加,不然编译通不知道QueueItem是类型还是模板
// QueueItem 是模板下的一个类型
//Queue::QueueItem:: 是pool的作用域
//QueueItem不是模板,是普通的类,不需要加模板类型参数
int main()
{
	Queue que;
	for (int i = 0; i < 10; ++i)
	{
		que.push(i + 1);
	}
}

 

你可能感兴趣的:(C++)