通用内存池

#include
#include

/*
目的:实现一个通用的内存池

过程:通过 MEM_POOL(内存池类),中的alloc实现其他类的new,dealloc实现其他类的delete,
使用内存池的类,在一个类下,使用同一个内存池。(通过static关键字来进行实现:单例模式,本次实现线程安全),
*/

const int MEM_SIZE = 10;

template
class MEM_POOL
{
public:
static MEM_POOL* getInstance()//单例模式(线程安全)
{
if(ppm == NULL)
{
ppm = new MEM_POOL();
}
return ppm;
}

void * alloc(size_t size)//申请大块空间向外部提供小空间
{
    if(pool == NULL)
    {
        pool = (Node *) new char[size*MEM_SIZE]();
        Node * pcur = pool;
        for(pcur;pcur < pool + MEM_SIZE + 1;pcur = pcur + 1)
        {
            pcur -> pnext = pcur + 1;
        }
        pcur -> pnext = NULL;
    }
    void * rt = pool;
    pool = pool -> pnext;
    return rt;
}

void  dealloc(void * ptr)//回收空间
{
    Node * nptr = (Node *) ptr;
    if(nptr == NULL)
    {
        return ;
    }
    nptr -> pnext = pool;
    pool = nptr;
}

private:
MEM_POOL()
{
pool = NULL;
}
MEM_POOL(const MEM_POOL&);
struct Node
{
public:
Node(T value = T())
:val(value),pnext(NULL)
{}
public:
T val;
Node * pnext;
};
Node * pool;//指向第一个可向外提供的空间,为null时再次使用alloc将再次申请大片空间。
static MEM_POOL * ppm;//确保单例
};

template
MEM_POOL * MEM_POOL:: ppm = NULL;

class Student
{
public:
Student(std::string name,std::string id,int ag)
:mname(name),mid(id),age(ag)
{}

void * operator new(size_t size)//对new进行重载
{
    return pmm->alloc(size);
}

void operator delete(void * ptr)//对delete进行重载
{
    pmm -> dealloc(ptr);
}

private:
std::string mname;
std::string mid;
int age;
static MEM_POOL * pmm; //实现与 MEM_POOL进行对接
};

MEM_POOL * Student :: pmm = MEM_POOL::getInstance();

int main()
{
Student* pstu1 = new Student(“zhangsan”, “001”, 20);
Student* pstu2 = new Student(“lisi”, “002”, 19);
Student* pstu3 = new Student(“zhangsan”, “001”, 20);
Student* pstu4 = new Student(“lisi”, “002”, 19);

delete pstu1;
delete pstu2;
delete pstu3;
delete pstu4;
return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值