C++实现简单的内存池

没有考虑线程安全,只是简单的实现了内存池
功能:第一次先申请一大片内存,然后分成小块,每次分配给应用程序这小块内存,当内存不够了又继续向系统申请一大片内存
直接晒代码

MemPool.h

#include <iostream>
template<typename T>
class MemPool
{
public:
    MemPool(){}
    MemPool(T data) :data(data){}
    //这两个函数编译器就默认处理成static函数
    void *operator new(size_t size)
    {
        MemPool *pCur;
        if (!pHead)//如果内存不够了,向系统申请内存
        {
            int allocsize = size * MEM_POOL_SIZE;
            cout << "第" << ++count << "向系统申请了" << allocsize << "字节内存" << endl;
            pHead = (MemPool*)new char[allocsize];
            for (pCur = pHead; pCur < pHead + MEM_POOL_SIZE - 1;++pCur)
                pCur->pNext = pCur + 1;
            pCur->pNext = NULL;
        }
        pCur = pHead;
        pHead = pHead->pNext;
        return pCur;//这里只是把其中一片内存给用户了,用户并不能通过 ->pNext 得到下一片内存★★★★★
    }
    void operator delete(void *ptr)
    {
        cout << "MemPool delete" << endl;
        if (!ptr) return;
        MemPool *cur = (MemPool*)ptr;
        cur->pNext = pHead;
        pHead = cur;
    }
public:
    MemPool *pNext;
    static const unsigned int MEM_POOL_SIZE = 10;
    static MemPool *pHead;
    static int count;
    T data;
};
template<typename T>
static MemPool<T> *initNull()
{
    cout << "initNull" << endl;
    return NULL;
}
template<typename T>
MemPool<T> *MemPool<T>::pHead = initNull<T>();
template<typename T>
int MemPool<T>::count = 0;

Queue.h

#include "Mempool.h"
template<typename T>
class Queue
{
public:
    Queue()
    {
        prear = pfirst = NULL;
    }
    ~Queue()
    {
        MemPool<T> *pcur = pfirst;
        while (pcur != prear)
        {
            pfirst = pfirst->pNext;
            delete pcur;
            pcur = pfirst;
        }
    }
    T front()
    {
        if (!pfirst)
            return NULL;
        return pfirst->data;
    }
    T back()
    {
        if (!prear)
            return NULL;
        return prear->data;
    }
    void push(const T &d)
    {
        /*prear = new MemPool<T>(d);
        if (!pfirst)
            pfirst = prear;*/
        MemPool<T> *p = new MemPool<T>(d);
        if (!prear)
            prear = pfirst = p;
        else
        {
            prear->pNext = p;
            prear = p;
        }
    }
    void pop()
    {
        if (pfirst == prear)
        {
            delete pfirst;
            pfirst = prear = NULL;
        }
        else
        {
            MemPool<T> *pFree = pfirst;
            pfirst = pfirst->pNext;
            delete pFree;
        }
    }
    bool empty()
    {
        if (prear == NULL && pfirst == NULL)
            return true;
        return false;
    }
private:
    MemPool<T> *prear;
    MemPool<T> *pfirst;
};

main

#include "Queue.h"
#include <queue>
using namespace std;

int main()
{
    Queue<int> q1;
    queue<int> q2;

    for (int i = 0; i < 22; i++)
    {
        q1.push(i);
        q2.push(i);
    }

    while (!q1.empty())
    {
        cout << q1.front() << " ";
        q1.pop();
    }

    while (!q2.empty())
    {
        cout << q2.front() << " ";
        q2.pop();
    }
    cout << endl;

    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值