一个简易内存池(C++)

Posted LC凑热闹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个简易内存池(C++)相关的知识,希望对你有一定的参考价值。

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

代码

  1 #include <iostream>
  2 #include<string>
  3 #include <list>
  4 using namespace std;
  5 
  6 //一个简单的内存池,池中保存3块内存分别为1k,2k,4k
  7 //实现池子的malloc(size)和free(void*)操作
  8 //不考虑跨块申请内存情况
  9 
 10 class node
 11 {
 12 public:
 13     int offset;//相对于起始地址偏移
 14     bool flag;//是有效地址还是已经分配地址
 15     int len;
 16     node()
 17     {
 18         offset=0;
 19         flag=true;
 20         len=0;
 21     }
 22     node(int sz)
 23     {
 24         offset=0;
 25         flag=true;
 26         len=sz;
 27     }
 28 };
 29 
 30 class memPool
 31 {
 32 public:
 33     memPool()
 34     {
 35         m_First_Count= 1024;
 36         m_Second_Count = 2*1024;
 37         m_Third_Count = 4*1024;
 38         m_First_Address = new char[m_First_Count];
 39         m_Second_Address = new char[m_Second_Count];
 40         m_Third_Address = new char[m_Third_Count];
 41         
 42         first.insert(first.begin(),new node(1024));        
 43         second.insert(second.begin(),new node(1024*2));        
 44         third.insert(third.begin(),new node(1024*4));
 45     }
 46     ~memPool()
 47     {
 48         delete[]m_First_Address;
 49         delete[]m_Second_Address;
 50         delete[]m_Third_Address;
 51         m_First_Address = NULL;
 52         m_Second_Address = NULL;
 53         m_Third_Address = NULL;
 54 
 55     }
 56     char* myMalloc(const int memSize)
 57     {
 58         //采用首次适应算法
 59         list<node*>::iterator it;
 60         if (memSize <= m_First_Count)
 61         {
 62             it = first.begin();
 63             while(it!=first.end())
 64             {
 65                 if (((*it)->len)>= memSize &&(*it)->flag == true)
 66                 {
 67                     (*it)->flag = false;
 68                     int temp = (*it)->len;
 69                     (*it)->len = memSize;
 70                     if (temp - memSize >0)
 71                     {
 72                         node *obj = new node;
 73                         obj->flag=true;
 74                         obj->len = temp - memSize;
 75                         obj->offset = (*it)->offset + memSize;
 76                         it++;
 77                         first.insert(it,obj);
 78                         it--;
 79                         it--;
 80                         m_First_Count-=memSize;
 81                         cout << "malloc "<< memSize << " in first memery"<<endl;
 82                         return m_First_Address+(*it)->offset;
 83                     }
 84                 }
 85                 it++;
 86             }
 87             
 88         }
 89 
 90         if (memSize <= m_Second_Count)
 91         {
 92             it = second.begin();
 93             while(it!=second.end())
 94             {
 95                 if (((*it)->len)>= memSize&&(*it)->flag == true)
 96                 {
 97                     (*it)->flag = false;
 98                     int temp = (*it)->len;
 99                     (*it)->len = memSize;
100                     if (temp - memSize >0)
101                     {
102                         node *obj = new node;
103                         obj->flag=true;
104                         obj->len = temp - memSize;
105                         obj->offset = (*it)->offset + memSize;
106                         it++;
107                         second.insert(it,obj);
108                         it--;
109                         it--;
110                         m_Second_Count-=memSize;
111                         cout << "malloc "<< memSize << "in second memery"<<endl;
112                         return m_Second_Address+(*it)->offset;
113                     }
114                 }
115                 it++;
116             }
117             
118         }
119 
120         if (memSize <= m_Third_Count)
121         {
122             it = third.begin();
123             while(it!=third.end())
124             {
125                 if (((*it)->len)>= memSize&&(*it)->flag == true)
126                 {
127                     (*it)->flag = false;
128                     int temp = (*it)->len;
129                     (*it)->len = memSize;
130                     if (temp - memSize >0)
131                     {
132                         node *obj=new node;
133                         obj->flag=true;
134                         obj->len = temp - memSize;
135                         obj->offset = (*it)->offset + memSize;
136                         it++;
137                         third.insert(it,obj);
138                         it--;
139                         it--;
140                         m_Third_Count-=memSize;
141                         cout << "malloc "<< memSize << "in third memery"<<endl;
142                         return m_Third_Address+(*it)->offset;
143                     }
144                 }
145                 it++;
146             }
147             
148         }
149 
150         cout<<"no memery\n";
151         return NULL;
152 
153     }
154 /************************************************************************/
155 /* 算法思路是第一步定位这个指针位于哪一个内存块,第二步在对应内存块中找到*/
156 /*其node,然后判断node前后是否都为有效内存,也就是没有被利用的内存块*/
157 /************************************************************************/
158     void memFree(void* address_arg)
159     {
160         char *freeAddress= static_cast<char*>(address_arg);
161         int offset;
162         list<node*>::iterator it;
163         if (freeAddress >= m_First_Address && freeAddress < (m_First_Address+1024))//位于第一块
164         {
165             offset = freeAddress - m_First_Address;
166             it = first.begin();
167 
168             while(it!= first.end())//定位offset
169             {
170                 if (offset == (*it)->offset)
171                     break;
172 
173                 it++;
174             }
175             if (it == first.end())//没有找到offset
176             {
177                 cout << "In first memery,there is no memery of freeaddress"<<endl;
178                 return;
179             }
180             
181             if((*it)->flag == true)//找到offset,但是这块内存没有分配
182             {
183                 cout << "In first memery,the freeAddress is valid,you can‘t free it"<<endl;
184                 return;
185             }
186             (*it)->flag = true;
187             
188             int len = (*it)->len;
189             int count=0;
190             if (it!=first.end())//判断it后继节点是否被分配
191             {
192                 it++;
193                 if ((*it)->flag == true)
194                 {
195                     len+=(*it)->len;
196                     count++;
197                 }
198                 it--;
199             }
200             if (it!=first.begin())
201             {
202                 it--;
203                 if ((*it)->flag == true)
204                 {
205                     len+=(*it)->len;
206                     count++;
207                 }
208                 else
209                     it++;
210             }
211             (*it)->len = len;
212             it++;
213             while(count--)
214             {
215                 it = first.erase(it);//erase返回删除节点的后继节点        
216                 
217             }        
218             
219             cout << "free success"<<endl;
220             return;
221 
222         }
223         else if (freeAddress >= m_Second_Address && freeAddress < (m_Second_Address+1024*2))//位于第二块
224         {
225             offset = freeAddress - m_Second_Address;
226             it = second.begin();
227 
228             while(it!= second.end())//定位offset
229             {
230                 if (offset == (*it)->offset)
231                     break;
232 
233                 it++;
234             }
235             if (it == second.end())//没有找到offset
236             {
237                 cout << "In second memery,there is no memery of freeaddress"<<endl;
238                 return;
239             }
240 
241             if((*it)->flag == true)//找到offset,但是这块内存没有分配
242             {
243                 cout << "In second memery,the freeAddress is valid,you can‘t free it"<<endl;
244                 return;
245             }
246             (*it)->flag = true;
247 
248             int len = (*it)->len;
249             int count=0;
250             if (it!=second.end())//判断it后继节点是否被分配
251             {
252                 it++;
253                 if ((*it)->flag == true)
254                 {
255                     len+=(*it)->len;
256                     count++;
257                 }
258                 it--;
259             }
260             if (it!=second.begin())
261             {
262                 it--;
263                 if ((*it)->flag == true)
264                 {
265                     len+=(*it)->len;
266                     count++;
267                 }
268                 else
269                     it++;
270             }
271             (*it)->len = len;
272             it++;
273             while(count--)
274             {
275                 it = second.erase(it);
276             }        
277 
278             cout << "free success"<<endl;
279             return;
280         }
281         else if (freeAddress >= m_Third_Address && freeAddress < (m_Third_Address+1024*4))//位于第三块
282         {
283             offset = freeAddress - m_Third_Address;
284             it = third.begin();
285 
286             while(it!= third.end())//定位offset
287             {
288                 if (offset == (*it)->offset)
289                     break;
290 
291                 it++;
292             }
293             if (it == third.end())//没有找到offset
294             {
295                 cout << "In third memery,there is no memery of freeaddress"<<endl;
296                 return;
297             }
298 
299             if((*it)->flag == true)//找到offset,但是这块内存没有分配
300             {
301                 cout << "In third memery,the freeAddress is valid,you can‘t free it"<<endl;
302                 return;
303             }
304             (*it)->flag = true;
305 
306             int len = (*it)->len;
307             int count=0;
308             if (it!=third.end())//判断it后继节点是否被分配
309             {
310                 it++;
311                 if ((*it)->flag == true)
312                 {
313                     len+=(*it)->len;
314                     count++;
315                 }
316                 it--;
317             }
318             if (it!=third.begin())
319             {
320                 it--;
321                 if ((*it)->flag == true)
322                 {
323                     len+=(*it)->len;
324                     count++;
325                 }
326                 else
327                     it++;
328             }
329             (*it)->len = len;
330             it++;
331             while(count--)
332             {
333                 it = third.erase(it);
334             }        
335 
336             cout << "free success"<<endl;
337             return;
338         }
339         else
340         {
341             cout << "the memery to be freed is invalid\n";
342         }
343         return;
344     }
345 private:
346     char *m_First_Address;//每一块内存起始地址
347     char *m_Second_Address;
348     char *m_Third_Address;
349     int m_First_Count;//剩余有效地址大小,不一定是连续,是第一块内存中所有有效之和
350     int m_Second_Count;
351     int m_Third_Count;
352     list<node*> first;
353     list<node*> second;
354     list<node*> third;
355 
356 };
357 int main()
358 {
359     memPool obj;
360     char *ptr1 = obj.myMalloc(10);    
361     char *ptr2 = obj.myMalloc(100);
362     char *ptr3 = obj.myMalloc(500);
363     char *ptr4 = obj.myMalloc(4*1024+1);
364     obj.memFree(ptr2);
365     obj.memFree(ptr3);
366 
367     return 0;
368 }

 

以上是关于一个简易内存池(C++)的主要内容,如果未能解决你的问题,请参考以下文章

华为OD机试真题Java实现简易内存池2真题+解题思路+代码(2022&2023)

转内存管理内幕mallco及free函数实现--简易内存分配器内存池GC技术

简易内存池

简易内存池

用C++实现一个简易的线程池

华为机试真题 C++ 实现内存资源分配