
#ifndef __MEMPOOL_H__
#define __MEMPOOL_H__
#include "stdio.h"
#include "stdlib.h"
#include <string.h>
class CMemPool

{
protected:
CMemPool()
{
}
public:
~CMemPool()
{
}
virtual int MallocNode(int) = 0;
virtual int FreeNode(int ,int) = 0;
virtual int Init() = 0;
};
#define GET(x,y) inline x Get_##y() {\
return _##y;\
}
#define SET(x,y) inline x Set_##y(x t) {\
_##y = t;\
return _##y;\
}
#define SET_GET(x,y) SET(x,y) GET(x,y)
#define FREE(x) free(x);x=NULL;
class CMemPoolChar:public CMemPool

{
protected:
int _maxsize;
int _curpos;
public:
char * _data;
public:
SET_GET(int,maxsize);
SET_GET(int,curpos);
public:
CMemPoolChar(int size):_maxsize(size),_data(NULL),_curpos(0)
{}
~CMemPoolChar()
{
if(_data != NULL)
{
FREE(_data)
}
}
int Init();
int MallocNode(int );
int FreeNode(int ,int);
};
typedef char *(CMemPoolChar::*mempointer);
typedef struct _MEM_STRUCT_

{
int _value;
int _flag;
_MEM_STRUCT_ * prev;
_MEM_STRUCT_ * next;
}MEMSTRUCT,*LPMEMSTRUCT;
class CSMemPool:public CMemPool

{
public:
LPMEMSTRUCT _data;
LPMEMSTRUCT _free;
protected:
int _maxcell;
public:
SET_GET(int,maxcell);
CSMemPool(int num):_maxcell(num)
{_data = _free = NULL;}
~CSMemPool();
int Init();
int MallocNode(int = 0);
int FreeNode(int,int = 0);
};
#endif
#include "mempool.h"
int CMemPoolChar::Init()

{
int i_ret = -1;
if(Get_maxsize() <= 0)
{
return i_ret;
}
i_ret = -2;
_data = (char *)malloc(sizeof(char)*Get_maxsize());
if(_data == NULL)
{
return i_ret;
}
i_ret = 0;
memset(_data,0,Get_maxsize());
return i_ret;
}
int CMemPoolChar::MallocNode(int len)

{
int i_ret = -1;
if(Get_curpos() + len >= Get_maxsize())
{
return i_ret;
}
char * tmp = _data+Get_curpos();
i_ret = Get_curpos();
Set_curpos(Get_curpos()+len);
return i_ret;
}
int CMemPoolChar::FreeNode(int data,int len)

{
int i_ret = 0;
memset((void *)(_data + data),0,len);
memmove(_data+data,_data+data+len,Get_curpos() - data - len);
Set_curpos(Get_curpos() - len);
memset((void *)(_data + Get_curpos()),0,Get_maxsize() - Get_curpos());
i_ret = Get_curpos();
return i_ret;
}

CSMemPool::~CSMemPool()

{
if(_data != NULL)
{
FREE(_data);
}
_free = NULL;
Set_maxcell(0);
}
int CSMemPool::Init()

{
int i_ret = 0;
if(Get_maxcell() <= 0)
{
Set_maxcell(10);
}
_data = (LPMEMSTRUCT)malloc(sizeof(MEMSTRUCT)*Get_maxcell());
if(_data == NULL)
{
return i_ret;
}
memset(_data,0,sizeof(MEMSTRUCT)*Get_maxcell());
i_ret = -2;
_free = (LPMEMSTRUCT)malloc(sizeof(MEMSTRUCT));
if(_data == NULL)
{
return i_ret;
}
memset(_free,0,sizeof(MEMSTRUCT));
i_ret = 0;
LPMEMSTRUCT p = _data;
LPMEMSTRUCT q = _free;
q->prev = NULL;
int i_len = Get_maxcell();
while(i_len--)
{
q->next = p;
p->prev = q;
q = p++;
}
(p-1)->next = _free->next;
_free->next->prev = q;
return i_ret;
}



int CSMemPool::MallocNode(int invalid)

{
if(_free->next == NULL)
{
return /**//*(LPMEMSTRUCT)NULL*/0;
}
//Last Node
LPMEMSTRUCT p = _free->next->prev;
if(p == _free->next)
{
_free->next = _free->prev = NULL;
return (int)p;
}
p->prev->next = _free->next;
_free->next->prev = p->prev;
return (int)p;
}


int CSMemPool::FreeNode(/**//*LPMEMSTRUCT data*/int datapos,int invalid)

{
if(datapos <= 0)
{
return 0;
}
LPMEMSTRUCT data = (LPMEMSTRUCT)datapos;
memset(data,0,sizeof(MEMSTRUCT));
if(_free->next != NULL)
{
LPMEMSTRUCT q = _free->next;
data->prev = q->prev;
q->prev = data;
data->next = q;
_free->next = data;
}
else
{
_free->next = data;
data->next = data;
data->prev = data;
}
}

/**//*test*/
int main(int argc,char * argv[])

{
CSMemPool c(3);
c.Init();
LPMEMSTRUCT c3 = (LPMEMSTRUCT)c.MallocNode();
c.FreeNode((int)c3);
CMemPoolChar ab(100);
mempointer lppoint = &CMemPoolChar::_data;
ab.Init();
char * a1 = ab.*lppoint+ab.MallocNode(15);
memcpy(a1,"Hello World!",12);
char * a2 = ab.*lppoint+ab.MallocNode(25);
memcpy(a2,"echo -e \"Hello World!\"",25);
char * a3 = ab.*lppoint+ab.MallocNode(25);
memcpy(a3,"ps -ef |fgrep \"Hello\"",25);
ab.FreeNode(a2 - ab.*lppoint,25);
}为了减少系统申请,释放内存的开销(有时申请释放频繁,可能会导致系统异常)和程序的有效运行;系统初始化时,将需要申请的内存统一申请下来,如果程序中需要申请空间,可以在预留空间中申请,如果空间已满,可以通过写文件或其它方式处理。