关于大小不变的对象的内存池管理

这是我写的一个简单的内存管理类,主要是用在:如果有种大小不变的对象要频繁的new和delete,为了防止产生大量的内存碎片和提高效率,可以考虑使用下面的内存管理类。下一篇文章,我将介绍如何使用这个类

#ifndef _MEMPOOL_H
#define _MEMPOOL_H
/********************************************************************
 created: 2004/11/29
 created: 29:11:2004   16:02
 filename:  ../memory pool/test/cmempool.h
 file path: ../memory pool/test
 file base: cmempool
 file ext: h
 author:  David
 
 purpose: 同等大小的小对象如果频繁的动态申请与释放(eg: s
   erver),必然会导致系统产生大量的内存碎片,这样
   当系统长时间的运行后,就会因为大量的内存碎片而
   导致无法再分配出内存,这样我们的软件就会变的不
   稳定,而且频繁的new和delete会导致效率低下,因此
   需要有自己内存管理。下面的类就是一个简单的内存
   管理。
*********************************************************************/

#include "Lock.h"

template <class CNode>
struct Mem_Pool_Node
{
 union {
  char Obj[sizeof(CNode)];
  Mem_Pool_Node *m_pNext;
 };
};

template <class CNode>
class CMemPool
{
 typedef Mem_Pool_Node<CNode>*  Mem_Pool_Node_Type;
public:
 CMemPool(){
  m_pListFreePool = NULL;
  m_nInuse = 0;
  m_nFree = 0;
 };

 virtual ~CMemPool(){
  Mem_Pool_Node_Type pPreNode= NULL;
  Mem_Pool_Node_Type pNode= NULL;

  m_Lock.Lock();
  pPreNode = m_pListFreePool;
  pNode = m_pListFreePool;  
  while (NULL != pNode) {
   pPreNode = pNode;
   pNode = pNode->m_pNext;

   delete pPreNode;
   pPreNode = NULL;
  }
  m_Lock.Unlock();
 };
 
 CNode *Allocate(){
  void *p = NULL;
  Mem_Pool_Node_Type pNode= NULL;

  if (NULL == m_pListFreePool) {
   try{
    p = (::operator new(sizeof(CNode)));
   }
   catch (...) {
    if (p != NULL) {
     ::operator delete ((CNode *)(p));
     p = NULL;
    }

    return NULL;
   }

   m_Lock.Lock();
   m_nInuse++;
   m_Lock.Unlock();
  }
  else{
   m_Lock.Lock();
   pNode = m_pListFreePool;
   m_pListFreePool = m_pListFreePool->m_pNext;

   p = pNode;

   m_nFree--;
   m_nInuse++;
   m_Lock.Unlock();
  }

  return static_cast<CNode *>(p);
 };
 
 void Release(void *p){
  if (NULL == p) {
   return;
  }

  m_Lock.Lock();
  if (NULL == m_pListFreePool) {
   m_pListFreePool = static_cast<Mem_Pool_Node_Type>(p);
   m_pListFreePool->m_pNext = NULL;
  }
  else{
   (static_cast<Mem_Pool_Node_Type>(p))->m_pNext = m_pListFreePool;
   m_pListFreePool = static_cast<Mem_Pool_Node_Type>(p);
  }

  m_nInuse--;
  m_nFree++;
  m_Lock.Unlock();
 }; 
  
 void GetInfo(int &inuse, int &free){
  inuse = m_nInuse;
  free = m_nFree;
 };
private:
 CLock m_Lock;

 int m_nInuse;
 int m_nFree;

 Mem_Pool_Node_Type m_pListFreePool;
};

#endif

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值