码迷,mamicode.com
首页 > 其他好文 > 详细

一个简单的内存管理器

时间:2020-06-03 20:32:49      阅读:71      评论:0      收藏:0      [点我收藏+]

标签:span   bsp   oid   let   rsize   size   简单   while   void   

#include <iostream>
using namespace std;
/*
 * 内存管理器,分配大块内存供使用,最后集中回收
 */
class AllocMem {
private:
    enum {BlockSize = 2048};//buffer尺寸大小
    struct Block {
        Block *next;
        char buffer[BlockSize];
    };//分配内存的基本单元

    Block *pHead;
    enum {HeaderSize = sizeof(Block) - BlockSize};
    char *m_begin;//指向空闲内存开始的地址
    char *m_end;//指向空闲内存结束的地址

public:
    AllocMem();
    ~AllocMem();
    void *alloc(int n);
    
private:
    void clear(); // 析构并释放所有分配的对象
};


AllocMem::AllocMem(){
    m_begin = m_end = nullptr;
    pHead = nullptr;
}
AllocMem::~AllocMem(){
    clear();
}
void *AllocMem::alloc(int n) {
    int size = m_end - m_begin;//m_end > m_begin,地址增长方向

    if (size < n) {
        if (n > BlockSize) {
            Block *p = (Block *) malloc(n + HeaderSize);
            if (pHead){
                p->next = pHead->next;
                pHead->next = p;
            } else{
                m_end = m_begin = p->buffer;
                pHead = p;
                p->next = nullptr;
            }
            return p->buffer;
        }
        else {
            Block *p = (Block*)malloc(sizeof(Block));
            p->next = pHead;
            m_begin = p->buffer;
            m_end = m_begin + BlockSize;
        }
    }
    return m_end = m_end - n;
}
void AllocMem::clear(){
    Block *p = pHead;
    Block *q = nullptr;
    while (p){
        q = p->next;
        delete p;
        p = q;
    }
    m_end = m_begin = nullptr;
}


int main(){
    AllocMem alloc;
    double *a = (double *)alloc.alloc(sizeof(double));
    *a = 4.5;
    double *b = (double*) alloc.alloc(sizeof(double));
    cout << *a  << " " << b << endl;
}

 

一个简单的内存管理器

标签:span   bsp   oid   let   rsize   size   简单   while   void   

原文地址:https://www.cnblogs.com/niubidexiebiao/p/13039658.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!