一个简易内存池(C++)
做这个内存池主要是为了完成一道面试题,题目在代码中。
代码
#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++)的更多相关文章
- 基于Win32 SDK实现的一个简易线程池
利用C++实现了一个简易的线程池模型(基于Win32 SDK),方便使用多线程处理任务.共包含Thread.h.Thread.cpp.ThreadPool.h.ThreadPool.cpp四个源文件. ...
- C++内存管理:简易内存池的实现
什么是内存池? 在上一篇 C++内存管理:new / delete 和 cookie中谈到,频繁的调用 malloc 会影响运行效率以及产生额外的 cookie, 而内存池的思想是预先申请一大块内存, ...
- [Golang] 一个简易代理池
晚上写了一个代理池,就是在一个代理网站上爬取代理ip和端口以及测试是否可用.接下来可能考虑扩展成一个比较大的 golang实现的代理池. 简易版代码: package main import ( &q ...
- 对象池与.net—从一个内存池实现说起
本来想写篇关于System.Collections.Immutable中提供的ImmutableList里一些实现细节来着,结果一时想不起来源码在哪里--为什么会变成这样呢--第一次有了想写分析的源码 ...
- 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 ...
- nginx源代码分析之内存池实现原理
建议看本文档时结合nginx源代码. 1.1 什么是内存池?为什么要引入内存池? 内存池实质上是接替OS进行内存管理.应用程序申请内存时不再与OS打交道.而是从内存池中申请内存或者释放内存到内存池 ...
- 内存池-转载自IBM
[转载自IBM]讲的很好~推荐看看 6.1 自定义内存池性能优化的原理 如前所述,读者已经了解到"堆"和"栈"的区别.而在编程实践中,不可避免地要大量用到堆上的 ...
- Boost内存池使用与测试
目录 Boost内存池使用与测试 什么是内存池 内存池的应用场景 安装 内存池的特征 无内存泄露 申请的内存数组没有被填充 任何数组内存块的位置都和使用operator new[]分配的内存块位置一致 ...
- 内存分配(new/delete,malloc/free,allocator,内存池)
以下来源http://www.cnblogs.com/JCSU/articles/1051826.html 程序员们经常编写内存管理程序,往往提心吊胆.如果不想触雷,唯一的解决办法就是发现所有潜伏的地 ...
随机推荐
- 树状数组(Binary Indexed Tree,BIT)
树状数组(Binary Indexed Tree) 前面几篇文章我们分享的都是关于区间求和问题的几种解决方案,同时也介绍了线段树这样的数据结构,我们从中可以体会到合理解决方案带来的便利,对于大部分区间 ...
- appium python andiroid自动化文档整理笔记
from appium import webdriver import time,unittest,HTMLTestRunner class Testlogin(unittest.TestCase): ...
- mongoDB学习手记1--Windows系统下的安装与启动
第一步:下载安装包 我们首先需要下载 mongodb 的安装包,直接到官网下载即可.地址为:https://www.mongodb.com/download-center#community. 看下自 ...
- uva 1121 Subsequence
https://vjudge.net/problem/UVA-1121 题意: 给出一个正整数数列a,要求找出最短的连续的一个序列使得这个序列的所有数字之和大于等于S. 思路: 第一是由于序列都是正整 ...
- 使用Xshell+Xmanager远程监控jvisualvm
使用jvisualvm的remote方式监控服务器端jvisualvm时,不是很方便,因此通过local方式,应该是正路. 一.服务器端(Linux,最小安装模式,没有图形界面) 1.安装xauth ...
- Find The Multiple (poj1426 一个好的做法)
Find The Multiple Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16505 Accepted: 673 ...
- Two Sum IV - Input is a BST
Given a Binary Search Tree and a target number, return true if there exist two elements in the BST s ...
- C#分布式事务解决方案-TransactionScope
引用一下别人的导读:在实际开发工作中,执行一个事件,然后调用另一接口插入数据,如果处理逻辑出现异常,那么之前插入的数据将成为垃圾数据,我们所希望的是能够在整个这个方法定义为一个事务,Transacti ...
- IDL 结构体
1.创建结构体 (1) 命名结构体 创建具有两个成员变量A.B的命名为str1的结构体 IDL> struct1={str1,a:1,b:2} IDL> help,struct1,/str ...
- SQL Server XML数据解析
--5.读取XML --下面为多种方法从XML中读取EMAIL DECLARE @x XML SELECT @x = ' <People> <dongsheng> <In ...