队列的内存池简单实现(new与delete的重载)

本文介绍了如何使用C++实现一个简单的队列内存池,并探讨了通过重载new和delete关键字来优化内存分配和释放的过程。通过对内存池的运用,可以提高内存管理效率,减少碎片化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>

using namespace std;

template <typename T>
class Queue
{
public:
    Queue()
    {
        _front = _rear = new QueueItem();
    }
    ~Queue()
    {
        QueueItem *cur = _front;
        while (cur != nullptr)
        {
            _front = _front->_next;
            delete cur;
            cur = _front;
        }
    }
    void push(const T &val)
    {
        QueueItem *item = new QueueItem(val);
        _rear->_next = item;
        _rear = item;;
    }
    void pop()
    {
        if (empty())
        {
            return;
        }
        QueueItem *first = _front->_next;
        _front->_next = first->_next;
        if (_front->_next == nullptr)
        {
            _rear = _front;
        }
        delete first;
    }
    T front()const
    {
        return _front->next__data;
    }
    bool empty()
    {
        return _front == _rear;
    }
private:
    struct QueueItem //产生一个对象池(里面有大量的节点)
    {
        QueueItem(T data = T()) :_data(data), _next(nullptr) {}
        //给QueueItem提供自定义内存管理
         void* operator new(size_t size)
        {
            if (_itempool == nullptr)
            {
                _itempool = (QueueItem*)new char[sizeof(QueueItem)*POOL_ITEM_SIZE];
                QueueItem *p = _itempool;
                for (; p < _itempool + POOL_ITEM_SIZE - 1; ++p)
                {
                    p->_next = p + 1;
                }
                p->_next = nullptr;               
            }
                QueueItem *p = _itempool;
                _itempool = _itempool->_next;
                return p;
        }
        void operator delete(void *ptr)
        {
            QueueItem *p = (QueueItem*)ptr;
            p->_next = _itempool;
            _itempool = p; 
        }
        static const int POOL_ITEM_SIZE = 100000;
        static QueueItem *_itempool;
        T _data;
        QueueItem *_next;
    };
    QueueItem *_front;
    QueueItem *_rear;
};
template <typename T>
typename Queue<T>::QueueItem *Queue<T>::QueueItem::_itempool = nullptr;

int main()
{
    Queue<int> que;
    for (int i = 0; i < 20; i++)
    {
        que.push(i);
        que.pop();
    }
    cout << que.empty() << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值