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