/写一个简单的内存池
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();//释放内存池
}