内存池(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;
}