经常的new delete 导致可用内存越来越小, 这就是内存碎块 就是内存有各种各样大小不一样的节点 , 长时间在 new delete 这时候操作系统 在内存, 上分一块内存给你, 分出去了 好几块,内存紧张了, 释放这中间 就有一些内存用不了 就是有一些很小的空闲内存, 但是你申请的空间 可能就比他们要大, 什么东西需要防止内存碎片呢?一般需要大量数据节点的,都需要自己的缓冲池 也就是根据系统的负载开一块很大的内存出来,比如一个在线用户的信息 节点 因为你一天的活跃用户可能上万,但是当前可能在线的可能只有三千,五千 也就是你一天 会有成千上万的用户 上线, 如果去冲击系统的new malloc ,那么就会造成内存碎片为了 解决这个文件,就要对这些节点做缓冲池**

代码设计

#define MAX_SESSION_NUM 6000  //缓冲池大小
#define my_malloc malloc 
#define my_free free

//用户节点结构体
struct  session{
	char c_ip[32];
	int c_port;
	int c_sock;
	struct  session * _next;

};


struct {

	struct session* online_session;

	struct session* cache_mem; //缓存池

	struct session* free_list;  //链表头指针

}session_manager ;


//清空内存
	memset(&session_manager, 0, sizoef(session_manager));
	//将6000节点  一次缓冲池分配出来 
	session_manager.cache_mem = (struct session*)my_malloc(MAX_SESSION_NUM * sizeof(struct session));
    memset(session_manager.cache_mem, 0, MAX_SESSION_NUM * sizeof(struct session));
		//把没有使用的list全部放在 free_list 链表
			for (int i = 0; i<MAX_SESSION_NUM;i++){
		session_manager.cache_mem[i]._next = session_manager.free_list;
		session_manager.free_list = &session_manager.cache_mem[i];

	}
	
	定义分配器
	static struct session* cache_alloc(){
	struct session*s = NULL;
	//可用的 缓冲池 必须是有节点 才能分配
	if (session_manager.free_list != NULL){
		s = session_manager.free_list;
		//因为free_list 指向缓冲池里最后一个节点
		//分配一个后 这个可用缓冲池 就指向上一个缓冲节点  
		session_manager.free_list = s->_next;
	}
	else{
	//当可用缓冲池用完,防止程序奔溃 在极少数的情况下
	//这时候就要调用系统的分配内存   
	//少次数的调用malloc  不会引发内存碎片
		s = my_malloc(sizeof(struct  session));
		
	}
	//情况当前内存信息  应为可能存在使用情况
	memset(s,0, sizeof(struct session));
	return s;
}

static void cache_free(struct session* s)
{
	//判断是从 cache 分配的 还是从系统 malloc分配的
	//只需要判断 他的内存范围 是不是在这个分配的内存里面
	if (s >= session_manager.cache_mem && s < session_manager.cache_mem + MAX_SESSION_NUM)
	{
		//内存不释放  
		//当前使用的 上一个就是申请时 赋值给free_list的
		s->_next = session_manager.free_list;
		//记录当前这个节点
		session_manager.free_list = s;

	}
	else{//系统分配的
		my_free(s);
	}
}


	

这是上面的调试信息