C++实现简单内存池

/写一个简单的内存池

class Cgirl {
public:
	int bh;//编号
	int xw;//胸围
	
	static char* m_pool; //内存池的初始地址


	//内存池初始化函数、
	static bool initpool() {
		cout << "调用初始化函数\n\n";
		m_pool = (char*)malloc(18);//向堆内存空间申请18字节
		if (m_pool == 0)return false;
		memset(m_pool, 0, 18);//清空这是18个字节
		return true;
	}

	//释放内存池的函数
	static void freePool() {
		if (m_pool == 0)return;
		free(m_pool);
		m_pool = 0;
		cout << "内存池已释放\n\n";
	}

	//重载new函数 重载的new 和 delete默认都是static的
	void* operator new(size_t size) {//参数必须是size_t (unsigned long long ),返回值必须是void*
		
		//分配第一个位置
		if (m_pool[0] == 0) {//判断第一个位置是否可以存0ok  1 not ok
			m_pool[0] = 1;//设置为已用状态
			cout << "分配了第一块内存: "<<(void*)(m_pool+1) << endl<<endl;
			return m_pool + 1;//返回这块内存的起始地址
		}
		//分配第二个位置
		if (m_pool[9] == 0) {
			m_pool[9] = 1;//设置为已用状态
			cout << "分配了第二块内存: " << (void*)(m_pool + 10)<<endl << endl;
			return m_pool + 10;//返回这块内存的起始地址
		}
		//以上两个位置都不可用,直接向内存申请空间
		void* ptr = malloc(size);
		cout << "以上两个位置都不可用,直接向内存申请空间的地址是: " << ptr <<endl<< endl;
		return ptr;
	}
	void operator delete(void* ptr) {
		if (ptr == 0)return;//地址为空直接退出
		if (ptr == m_pool + 1) {
			cout << "释放第一块内存 \n\n";
			m_pool[0] = 0;
			
			return;
		}
		if (ptr == m_pool + 10) 
		{
			cout << "释放第二块内存\n\n";
			m_pool[9] = 0;
		
			return;
		}
		//如果传过来的地址不属于内存池,就还给系统
		free(ptr);
	}



	Cgirl(int bh, int xw) {
		this->bh = bh;
		this->xw = xw;
		cout << "调用了Cgirl(int bh, int xw)构造器...."<<" bh= "<< this->bh<<
			" xw= "<<this->xw<<endl<<endl;
	}
	
	~Cgirl(){
		cout << "调用了析构函数........." << endl<<endl;
	}
};

//初始化内存池指针
char* Cgirl::m_pool = 0;
int main() {
	//初始化内存池
	if (Cgirl::initpool() == false) {
		cout << "初始化内存池失败...." << endl<<endl;
		return -1;
	}
	//使用内存池
	Cgirl* gptr1=new Cgirl(2, 36);//获得第一个对象
	cout << "gptr1地址是: " << gptr1 << " 编号是: " << gptr1->bh << " 胸围是: " << gptr1->xw <<endl<< endl;
	delete gptr1;//销毁

	Cgirl* gptr2 = new Cgirl(3, 37);//获得第一个对象
	cout << "gptr2地址是: " << gptr2 << " 编号是: " << gptr2->bh << " 胸围是: " << gptr2->xw << endl << endl;
	delete gptr2;//销毁

	Cgirl* gptr3 = new Cgirl(4, 38);//获得第一个对象
	cout << "gptr3地址是: " << gptr3 << " 编号是: " << gptr3->bh << " 胸围是: " << gptr3->xw << endl << endl;
	delete gptr3;//销毁

	Cgirl::freePool();//释放内存池


}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值