通用内存池

内存池(memory pool)是代替直接调用malloc/free、new/delete进行内存管理的常用方法,当我们申请内存空间时,首先到我们的内存池中查找合适的内存块,而不是直接向操作系统申请。是进程内存的管理方式之一

优势:
    1.效率高,不会频繁的从用户态切换到用户态,比malloc/free进行内存申请/释放的方式快;

    2.不会产生或很少产生堆碎片(内碎片,外碎片);

    3.可避免内存泄漏;

简单实现一个内存池:


#include<iostream>
#include <string>
using namespace std;

const int Mem_size=2;
template<typename T>
class Mem_pool
{
public:
	static Mem_pool *getinstance()//将内存池设成单例模式
	{
		cout<<"static Mem_pool *getinstance()"<<endl;
		return &mempool;
	}
	
	//static Mem_pool &getinstance()
	//{
	//	return mempool;
	//}
	
public:
	void* alloc(size_t size)//开辟内存
	{
		int allocsize=(size+4)*Mem_size;//(数据域+指针域的4字节)
		if(pool==NULL)
		{
			pool=(Node*)new char[allocsize]();//不写()也可以,因为Node里构造节点时将节点初始化了
			Node* pcur=pool;
			for(pcur;pcur<pool+Mem_size-1;++pcur)
			{
				pcur->pnext=pcur+1;
			}
			pcur->pnext=NULL;
		}

		Node* rt=pool;
		pool=pool->pnext;//如果不写这句,每次分配内存都将分配的是同一块内存
		return rt;
	}

	void dealloc(void* ptr)//释放内存
	{
		if(ptr==NULL)
			return;
			//return 0;error
		Node *mptr=(Node *)ptr;
		mptr->pnext=pool;
		pool=mptr;
	}

private:
	Mem_pool():pool(NULL){}//构造函数   单例模式
	Mem_pool(const Mem_pool<T> &);
	
	class Node
	{
	public:
		Node(T val=T()):mdata(val),pnext(NULL)//构造节点
		{}
	public:
		T mdata;
		Node* pnext;
	};

	Node *pool;

	static Mem_pool<T> mempool;//调用构造函数,生成一个内存池对象,返回这个内存池的地址即可 
};
template<typename T>
Mem_pool<T> Mem_pool<T>::mempool;//类外初始化

class Stu
{
public:
	Stu(char* name,int age):mname(new char[strlen(name)+1]),mage(age)
	{
		strcpy(mname,name);
	}

	void* operator new(size_t size)
	{
		return mpool->alloc(size);
	}

	void operator delete(void* ptr)
	{
		mpool->dealloc(ptr);
	}
	~Stu()
	{
		delete []mname;
		mname=NULL;
	}
private:
	int mage;
	char* mname;

	static Mem_pool<Stu>* mpool; //类内声明一个指向对象的指针//指向内存池对象
	//mpool->alloc(size);为了可以调用alloc(size),dealloc(ptr); 所以实例化一个对象指针,因为指针->调用成员方法
};
Mem_pool<Stu>* Stu::mpool=Mem_pool<Stu>::getinstance();//类外初始化

int main()
{
	Mem_pool<Stu>* spool1 = Mem_pool<Stu>::getinstance();
	 Mem_pool<Stu>* spool2 =  Mem_pool<Stu>::getinstance();
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值