一个简单实用的内存池类

自定义内存管理器

头文件(mymem.h):

#ifndef _my_mem_h6314854
#define _my_mem_h6314854

typedef struct humem
{
 int flag;        //标记是否在使用   // iFlag  nFlag
 int size;        //内存块的大小
 humem *pNext;    //下一个块的指针
}tMem,*ptMem; 

class mymem
{
 int num;         //内存块数   m_
 ptMem pHead;     //块区头指针  

 ptMem createMem(int size);   //申请新内存
public:
 mymem();
 ~mymem();
 void * getMem(int size);      //得到合适的内存
 ptMem getHead() { return pHead; }
 void freeMem(void * );//释放内存,即设置flag标记为0
};

#endif

实现文件(mymem.cpp):

#include "mymem.h"
#define NULL 0
mymem::mymem()
{
 num = 0;       //内存块数
 pHead = NULL;    //块区头指针
}
mymem::~mymem()
{
 ptMem temp;
 while (pHead!=NULL)
 {
  temp=pHead;
  pHead=pHead->pNext;
  delete(temp);
 }
}

ptMem mymem::createMem(int size)
{
 ptMem temptmem;
 temptmem = (tMem *)new char[size + sizeof(tMem)];
 if (temptmem == NULL)
 {
  return NULL;
 }

 temptmem->flag=0;  //未使用内存
 temptmem->size=size;

 if (pHead==NULL)//第一次申请内存
 {
  pHead=temptmem;
  temptmem->pNext=NULL;
 }
 else
 {
  temptmem->pNext=pHead;
  pHead=temptmem;
 }
 return temptmem;
}
void * mymem::getMem(int sizex)
{
 ptMem tempm;
 tempm=pHead;
 while (tempm!=NULL && tempm->flag==0)
 {
  if (tempm->size>sizex)   // 已经找到
  {
   tempm->flag=1;
   return (void *)(tempm + 1);
  }
  tempm=tempm->pNext;
 }

 tempm = createMem(sizex);
 tempm->flag = 1;  // 设置为使用状态
 return (void *)(tempm + 1);;

}

void mymem::freeMem(void * pMem)//释放内存,即设置flag标记为0然后将其移动到链表表头
{
 ptMem  tempm;
 tempm = (ptMem)pMem - 1;
 ptMem tempmh=pHead;
 tempm->flag=0;  // 设置为可用状态
 if (tempmh!=tempm)
 {
  while (tempmh->pNext!=tempm)
  {
   tempmh=tempmh->pNext;
  }
  tempmh->pNext = tempm->pNext;
  tempm->pNext=pHead;
  pHead=tempm; 
 }
}

 

主程序(main.cpp):

#include <iostream>
using namespace std;
#include "mymem.h"
void main()
{
 int i;
 mymem humem;
 ptMem tempmem;

 void * huproA[10];
 for (i=0;i<10;i++)
 {
  huproA[i]=humem.getMem(i*400+4);
 }
 
 tempmem=humem.getHead();
 while (tempmem!=NULL)
 {
  cout<<"内存大小:"<<tempmem->size<<"是否在使用"<<tempmem->flag<<endl;
  tempmem=tempmem->pNext;
 }

 humem.freeMem(huproA[0]);
 cout<<"_____________________/n";
 tempmem=humem.getHead();
 while (tempmem!=NULL)
 {
  cout<<"内存大小:"<<tempmem->size<<"是否在使用"<<tempmem->flag<<endl;
  tempmem=tempmem->pNext;
 }
}

### 内存池的基本原理 内存池是一种用于动态内存分配的技术,其核心思想是空间换时间。通过预先分配一大块内存,并将其划分为多个小块,内存池能够快速地为程序提供所需的内存,而无需每次都向操作系统申请。这样可以大大减少内存分配和释放的开销,提高程序的运行效率[^1]。 ### 内存池的优势 1. **减少内存分配和释放的开销**:预先分配一大块内存(称为“池”),避免频繁调用`malloc`/`new`和`free`/`delete`。 2. **减少内存碎片**:自主管理内存分配和释放,减少系统调用的开销,减少内存碎片,提高内存利用率[^3]。 ### 内存池的实现步骤 1. **定义内存池**:创建一个内存池,用于管理内存块的分配和释放。 2. **初始化内存池**:在构造函数中分配大块内存,并将其划分为多个小块。 3. **实现分配和释放方法**:提供`allocate`和`deallocate`方法,用于分配和释放内存块。 ### C++ 实现简易内存池 以下是一个简单的C++内存池实现示例: ```cpp #include <iostream> #include <vector> class MemoryPool { private: struct Block { Block* next; }; Block* freeList; std::vector<char> pool; public: MemoryPool(size_t blockSize, size_t blockCount) : pool(blockSize * blockCount) { freeList = reinterpret_cast<Block*>(pool.data()); for (size_t i = 0; i < blockCount; ++i) { Block* current = reinterpret_cast<Block*>(pool.data() + i * blockSize); current->next = (i + 1 < blockCount) ? reinterpret_cast<Block*>(pool.data() + (i + 1) * blockSize) : nullptr; } } void* allocate() { if (freeList == nullptr) { std::cerr << "Out of memory" << std::endl; return nullptr; } Block* result = freeList; freeList = freeList->next; return result; } void deallocate(void* ptr) { Block* block = static_cast<Block*>(ptr); block->next = freeList; freeList = block; } void printFreeBlocks() { int count = 0; Block* current = freeList; while (current != nullptr) { ++count; current = current->next; } std::cout << "Free blocks: " << count << std::endl; } }; int main() { // 创建内存池,块大小为32字节,总共可分配10个块 MemoryPool pool(32, 10); pool.printFreeBlocks(); // 应输出 10 // 分配三个内存块 void* ptr1 = pool.allocate(); void* ptr2 = pool.allocate(); void* ptr3 = pool.allocate(); pool.printFreeBlocks(); // 应输出 7 // 释放其中两个块 pool.deallocate(ptr1); pool.deallocate(ptr2); pool.printFreeBlocks(); // 应输出 9 // 再次分配一个块 void* ptr4 = pool.allocate(); pool.printFreeBlocks(); // 应输出 8 return 0; } ``` ### 内存池的工作流程 1. **内存池初始化**:分配大块内存,并将其划分为多个小块。 2. **分配内存块**:从空闲链表中取出一个内存块,返回给调用者。 3. **释放内存块**:将释放的内存块重新加入空闲链表中,以便下次分配[^4]。 ### 内存池的结构定义 ```cpp typedef struct { struct list_head list; int fd; // Unix系映射文件句柄 int tid; } Heap; typedef struct { unsigned int unMem_flg; // 块标志 unsigned int unMem_size; // 块大小 } Heapinf; #define ALLOCATE_MEM_ALL_BLOCK 0xFFFFFFFF // 不可分区的块 #define ALLOCATE_MEM_SEP_BLOCK 0x11111111 // 可分区的块 #define ALLOCATE_MEM_STATUS_USED 0x22222222 // 已使用的块 #define ALLOCATE_MEM_STATUS_FREE 0x33333333 // 未使用的块 ``` 通过上述代码和结构定义,可以实现一个简单内存池机制,从而提高程序的性能和内存利用率[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值