普通内存池的实现

内存池的实现:数据结构部分是用的静态链表

                        类和模板实现

代码示例:

#include <iostream>
using namespace std;

const int MEM_POOL_SIZE = 10;

template<typename T>
class Queue
{
public:
	class QueueItem; //嵌套类的前置声明
	Queue();         //构造函数
	~Queue();        //析构函数
	void Push(T val);//入队
	void Pop();      //出队
	T Getfront();       //获取队头结点
	T Getback();        //获取队尾结点
	bool IsEmpty();  //判空
	void Show();     //打印
private:
	class QueueItem   //结点类
	{
	public:
		QueueItem(T val = T());         //结点构造
		~QueueItem();                   //结点析构
		void* operator new(size_t size);//重载new
		void operator delete(void* ptr);//重载delete
	public:
		T mdata;
		QueueItem* pnext;
		static QueueItem* pool;
	};
	QueueItem* pfront;
	QueueItem* prear;
};

//类外初始化静态成员变量
template<typename T>
typename Queue<T>::QueueItem* Queue<T>::QueueItem::pool = NULL;

//类外实现构造函数
template<typename T>
Queue<T>::Queue()
{
	pfront = prear = new QueueItem();
}

//类外实现析构函数
template<typename T>
Queue<T>::~Queue()
{
	QueueItem* pCur = pfront;
	QueueItem* pNext = pCur;
	while (pCur != NULL)
	{
		pNext = pCur->pnext;
		delete pCur;
		pCur = pNext;
	}
	pfront = prear = NULL;
}

//类外实现入队
template<typename T>
void Queue<T>::Push(T val)
{
	QueueItem* pNewNode = new QueueItem(val);
	prear->pnext = pNewNode;
	prear = prear->pnext;
}

//类外实现出队
template<typename T>
void Queue<T>::Pop()
{
	if (!IsEmpty())
	{
		QueueItem* pCur = pfront->pnext;
		pfront->pnext = pCur->pnext;
		delete pCur;
	}
	else
	{
		throw exception("Queue Empty");//如果为空就抛出异常
	}
}

//类外实现获取队头结点函数
template<typename T>
T Queue<T>::Getfront()
{
	if (!IsEmpty())
	{
		return pfront->pnext->mdata;
	}
	else
	{
		throw exception("Queue Empty");
	}
}

//类外实现获取队尾结点函数
template<typename T>
T Queue<T>::Getback()  
{
	if (!IsEmpty())
	{
		return prear->mdata;
	}
	else
	{
		throw exception("Queue Empty");
	}
}

//类外实现判空函数
template<typename T>
bool Queue<T>::IsEmpty()
{
	return pfront == prear;
}

//类外实现打印函数
template<typename T>
void Queue<T>::Show()
{
	QueueItem* pCur = pfront->pnext;
	while (pCur != NULL)
	{
		cout << pCur->mdata << " ";
		pCur = pCur->pnext;
	}
	cout << endl;
}

//类外实现嵌套类的构造函数
template<typename T>
Queue<T>::QueueItem::QueueItem(T val)
{
	mdata = val;
	pnext = NULL;
}

//类外实现嵌套类的析构函数 析构函数是空函数
template<typename T>
Queue<T>::QueueItem::~QueueItem(){}

//类外实现new的重载
template<typename T>
void* Queue<T>::QueueItem::operator new(size_t size)
{
	if (pool == NULL)
	{
		int allocsize = size*MEM_POOL_SIZE;
		pool = (QueueItem*)new char[allocsize];
		QueueItem* pCur = pool;
		for (pCur; pCur < pool + MEM_POOL_SIZE - 1; ++pCur)
		{
			pCur->pnext = pCur + 1;
		}
		pCur->pnext = NULL;
	}
	QueueItem* rt = pool;
	pool = pool->pnext;
	return rt;
}

//类外实现delete的重载
template<typename T>
void Queue<T>::QueueItem::operator delete(void* ptr)
{
	if (ptr == NULL)
		return;
	QueueItem* pCur = (QueueItem*)ptr;
	pCur->pnext = pool;
	pool = pCur;
}

int main()
{
	Queue<int> que;
	for (int i = 0; i < 15; ++i)
	{
		que.Push(i + 1);
	}
	que.Show();

	cout << que.Getfront() << endl;

	cout << que.Getback() << endl;

	cout << que.IsEmpty() << endl;

	que.Pop();//出队每次出第一个数据结点
	que.Show();

	return 0;
}

运行结果:




猜你喜欢

转载自blog.csdn.net/moon5555/article/details/79438632