做这个内存池主要是为了完成一道面试题,题目在代码中。

代码

 #include <iostream>
#include<string>
#include <list>
using namespace std; //一个简单的内存池,池中保存3块内存分别为1k,2k,4k
//实现池子的malloc(size)和free(void*)操作
//不考虑跨块申请内存情况 class node
{
public:
int offset;//相对于起始地址偏移
bool flag;//是有效地址还是已经分配地址
int len;
node()
{
offset=;
flag=true;
len=;
}
node(int sz)
{
offset=;
flag=true;
len=sz;
}
}; class memPool
{
public:
memPool()
{
m_First_Count= ;
m_Second_Count = *;
m_Third_Count = *;
m_First_Address = new char[m_First_Count];
m_Second_Address = new char[m_Second_Count];
m_Third_Address = new char[m_Third_Count]; first.insert(first.begin(),new node());
second.insert(second.begin(),new node(*));
third.insert(third.begin(),new node(*));
}
~memPool()
{
delete[]m_First_Address;
delete[]m_Second_Address;
delete[]m_Third_Address;
m_First_Address = NULL;
m_Second_Address = NULL;
m_Third_Address = NULL; }
char* myMalloc(const int memSize)
{
//采用首次适应算法
list<node*>::iterator it;
if (memSize <= m_First_Count)
{
it = first.begin();
while(it!=first.end())
{
if (((*it)->len)>= memSize &&(*it)->flag == true)
{
(*it)->flag = false;
int temp = (*it)->len;
(*it)->len = memSize;
if (temp - memSize >)
{
node *obj = new node;
obj->flag=true;
obj->len = temp - memSize;
obj->offset = (*it)->offset + memSize;
it++;
first.insert(it,obj);
it--;
it--;
m_First_Count-=memSize;
cout << "malloc "<< memSize << " in first memery"<<endl;
return m_First_Address+(*it)->offset;
}
}
it++;
} } if (memSize <= m_Second_Count)
{
it = second.begin();
while(it!=second.end())
{
if (((*it)->len)>= memSize&&(*it)->flag == true)
{
(*it)->flag = false;
int temp = (*it)->len;
(*it)->len = memSize;
if (temp - memSize >)
{
node *obj = new node;
obj->flag=true;
obj->len = temp - memSize;
obj->offset = (*it)->offset + memSize;
it++;
second.insert(it,obj);
it--;
it--;
m_Second_Count-=memSize;
cout << "malloc "<< memSize << "in second memery"<<endl;
return m_Second_Address+(*it)->offset;
}
}
it++;
} } if (memSize <= m_Third_Count)
{
it = third.begin();
while(it!=third.end())
{
if (((*it)->len)>= memSize&&(*it)->flag == true)
{
(*it)->flag = false;
int temp = (*it)->len;
(*it)->len = memSize;
if (temp - memSize >)
{
node *obj=new node;
obj->flag=true;
obj->len = temp - memSize;
obj->offset = (*it)->offset + memSize;
it++;
third.insert(it,obj);
it--;
it--;
m_Third_Count-=memSize;
cout << "malloc "<< memSize << "in third memery"<<endl;
return m_Third_Address+(*it)->offset;
}
}
it++;
} } cout<<"no memery\n";
return NULL; }
/************************************************************************/
/* 算法思路是第一步定位这个指针位于哪一个内存块,第二步在对应内存块中找到*/
/*其node,然后判断node前后是否都为有效内存,也就是没有被利用的内存块*/
/************************************************************************/
void memFree(void* address_arg)
{
char *freeAddress= static_cast<char*>(address_arg);
int offset;
list<node*>::iterator it;
if (freeAddress >= m_First_Address && freeAddress < (m_First_Address+))//位于第一块
{
offset = freeAddress - m_First_Address;
it = first.begin(); while(it!= first.end())//定位offset
{
if (offset == (*it)->offset)
break; it++;
}
if (it == first.end())//没有找到offset
{
cout << "In first memery,there is no memery of freeaddress"<<endl;
return;
} if((*it)->flag == true)//找到offset,但是这块内存没有分配
{
cout << "In first memery,the freeAddress is valid,you can't free it"<<endl;
return;
}
(*it)->flag = true; int len = (*it)->len;
int count=;
if (it!=first.end())//判断it后继节点是否被分配
{
it++;
if ((*it)->flag == true)
{
len+=(*it)->len;
count++;
}
it--;
}
if (it!=first.begin())
{
it--;
if ((*it)->flag == true)
{
len+=(*it)->len;
count++;
}
else
it++;
}
(*it)->len = len;
it++;
while(count--)
{
it = first.erase(it);//erase返回删除节点的后继节点 } cout << "free success"<<endl;
return; }
else if (freeAddress >= m_Second_Address && freeAddress < (m_Second_Address+*))//位于第二块
{
offset = freeAddress - m_Second_Address;
it = second.begin(); while(it!= second.end())//定位offset
{
if (offset == (*it)->offset)
break; it++;
}
if (it == second.end())//没有找到offset
{
cout << "In second memery,there is no memery of freeaddress"<<endl;
return;
} if((*it)->flag == true)//找到offset,但是这块内存没有分配
{
cout << "In second memery,the freeAddress is valid,you can't free it"<<endl;
return;
}
(*it)->flag = true; int len = (*it)->len;
int count=;
if (it!=second.end())//判断it后继节点是否被分配
{
it++;
if ((*it)->flag == true)
{
len+=(*it)->len;
count++;
}
it--;
}
if (it!=second.begin())
{
it--;
if ((*it)->flag == true)
{
len+=(*it)->len;
count++;
}
else
it++;
}
(*it)->len = len;
it++;
while(count--)
{
it = second.erase(it);
} cout << "free success"<<endl;
return;
}
else if (freeAddress >= m_Third_Address && freeAddress < (m_Third_Address+*))//位于第三块
{
offset = freeAddress - m_Third_Address;
it = third.begin(); while(it!= third.end())//定位offset
{
if (offset == (*it)->offset)
break; it++;
}
if (it == third.end())//没有找到offset
{
cout << "In third memery,there is no memery of freeaddress"<<endl;
return;
} if((*it)->flag == true)//找到offset,但是这块内存没有分配
{
cout << "In third memery,the freeAddress is valid,you can't free it"<<endl;
return;
}
(*it)->flag = true; int len = (*it)->len;
int count=;
if (it!=third.end())//判断it后继节点是否被分配
{
it++;
if ((*it)->flag == true)
{
len+=(*it)->len;
count++;
}
it--;
}
if (it!=third.begin())
{
it--;
if ((*it)->flag == true)
{
len+=(*it)->len;
count++;
}
else
it++;
}
(*it)->len = len;
it++;
while(count--)
{
it = third.erase(it);
} cout << "free success"<<endl;
return;
}
else
{
cout << "the memery to be freed is invalid\n";
}
return;
}
private:
char *m_First_Address;//每一块内存起始地址
char *m_Second_Address;
char *m_Third_Address;
int m_First_Count;//剩余有效地址大小,不一定是连续,是第一块内存中所有有效之和
int m_Second_Count;
int m_Third_Count;
list<node*> first;
list<node*> second;
list<node*> third; };
int main()
{
memPool obj;
char *ptr1 = obj.myMalloc();
char *ptr2 = obj.myMalloc();
char *ptr3 = obj.myMalloc();
char *ptr4 = obj.myMalloc(*+);
obj.memFree(ptr2);
obj.memFree(ptr3); return ;
}

一个简易内存池(C++)的更多相关文章

  1. 基于Win32 SDK实现的一个简易线程池

    利用C++实现了一个简易的线程池模型(基于Win32 SDK),方便使用多线程处理任务.共包含Thread.h.Thread.cpp.ThreadPool.h.ThreadPool.cpp四个源文件. ...

  2. C++内存管理:简易内存池的实现

    什么是内存池? 在上一篇 C++内存管理:new / delete 和 cookie中谈到,频繁的调用 malloc 会影响运行效率以及产生额外的 cookie, 而内存池的思想是预先申请一大块内存, ...

  3. [Golang] 一个简易代理池

    晚上写了一个代理池,就是在一个代理网站上爬取代理ip和端口以及测试是否可用.接下来可能考虑扩展成一个比较大的 golang实现的代理池. 简易版代码: package main import ( &q ...

  4. 对象池与.net—从一个内存池实现说起

    本来想写篇关于System.Collections.Immutable中提供的ImmutableList里一些实现细节来着,结果一时想不起来源码在哪里--为什么会变成这样呢--第一次有了想写分析的源码 ...

  5. nginx源码分析—内存池结构ngx_pool_t及内存管理

    Content 0. 序 1. 内存池结构 1.1 ngx_pool_t结构 1.2 其他相关结构 1.3 ngx_pool_t的逻辑结构 2. 内存池操作 2.1 创建内存池 2.2 销毁内存池 2 ...

  6. nginx源代码分析之内存池实现原理

    建议看本文档时结合nginx源代码. 1.1   什么是内存池?为什么要引入内存池? 内存池实质上是接替OS进行内存管理.应用程序申请内存时不再与OS打交道.而是从内存池中申请内存或者释放内存到内存池 ...

  7. 内存池-转载自IBM

    [转载自IBM]讲的很好~推荐看看 6.1 自定义内存池性能优化的原理 如前所述,读者已经了解到"堆"和"栈"的区别.而在编程实践中,不可避免地要大量用到堆上的 ...

  8. Boost内存池使用与测试

    目录 Boost内存池使用与测试 什么是内存池 内存池的应用场景 安装 内存池的特征 无内存泄露 申请的内存数组没有被填充 任何数组内存块的位置都和使用operator new[]分配的内存块位置一致 ...

  9. 内存分配(new/delete,malloc/free,allocator,内存池)

    以下来源http://www.cnblogs.com/JCSU/articles/1051826.html 程序员们经常编写内存管理程序,往往提心吊胆.如果不想触雷,唯一的解决办法就是发现所有潜伏的地 ...

随机推荐

  1. Ansible系列(六):循环和条件判断

    本文目录:1. 循环 1.1 with_items迭代列表 1.2 with_dict迭代字典项 1.3 with_fileglob迭代文件 1.4 with_lines迭代行 1.5 with_ne ...

  2. angular学习笔记01

    angular.js路由功能 用于实现单页应用 //html 代码 <div ng-view></div> //js代码 angular.module('myM1',['ng' ...

  3. 2.bootstrap-全局css

    1.Bootstrap 网格系统 Bootstrap 提供了一套响应式.移动设备优先的流式网格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列. 1.基本的网格结构 下面是 ...

  4. Quartz学习——Spring和Quartz集成详解(三)

    Spring是一个很优秀的框架,它无缝的集成了Quartz,简单方便的让企业级应用更好的使用Quartz进行任务的调度.下面就对Spring集成Quartz进行简单的介绍和示例讲解!和上一节 Quar ...

  5. 第5章 不要让线程成为脱缰的野马(Keeping your Threads on Leash) ----初始化一个线程

    使用线程的一个常见问题就是如何能够在一个线程开始运行之前,适当地将它初始化.初始化最常见的理由就是为了调整优先权.另一个理由是为了在SMP 系统中设定线程比较喜欢的 CPU.第10 章谈到 MFC 时 ...

  6. Hadoop安全(2)——————UserGroupInformation

    UserGroupInformation保存hadoop用户及组信息 此类包装JAAS Subject,并提供确定用户的用户名和组的方法.它支持Windows,Unix和Kerberos登录模块.

  7. Number Complement

    Given a positive integer, output its complement number. The complement strategy is to flip the bits ...

  8. swiper拖拽之后不自动滑动问题

    //swiper轮播图 var mySwiper = new Swiper('.swiper-container',{ initialSlide :0, autoplay : 3000, direct ...

  9. 面向对象oop

    类和对象 1.什么是类?什么是对象? 1)现实世界是由很多很多对象组成的 基于对象抽出了类 2)对象:真实存在的单个的个体 类:类型/类别,代表一类个体 3)类中可以包含: 3.1)所有对象所共有的属 ...

  10. 系统出现异常: too many values to unpack (expected 2)

    先感谢[ValueError: too many values to unpack](http://leonzhan.iteye.com/blog/1720315)系统出现异常:打开太多值(预期2)这 ...