内存池是一种动态内存分配与管理技术,用于快速分配内存和内存归还;提前分配一片内存给内存池,需要使用内存时借用内存池的内存,使用后归还给内存池;内存池用到之前重载运算符的知识,以下是一个简单的内存池:
class people
{
public:
int tall;
int weight;
static char* pool;
static bool intpool()
{
pool = (char*)malloc(18);
if (pool == 0)return false;
memset(pool, 0, 18);//内容清空为零
cout << "内存池初始地址" << pool << endl;
cout << pool << endl;
return true;
}
static void freepool()
{
if (pool == 0)return;
free(pool);
cout << "内存池已释放" << endl;
}
people(int ta, int we) { tall = ta, weight = we; cout << "调用了构造函数" << endl; }
void* operator new(size_t size)
{
if (pool[0] == 0)
{
cout << "分配了第一块内存" << (void*)(pool + 1) << endl;
pool[0] = 1;
return pool + 1;
};
if (pool[9] == 0)
{
cout << "分配了第二块内存" << (void*)(pool + 10) << endl;
pool[9] = 1;
return pool + 10;
}
void* p = malloc(size);//内存不够时申请内存
cout << "申请的内存地址为" << p << endl;
return p;
};
void operator delete(void* p)
{
if (p == 0)return;
if (p == pool + 1)
{
cout << "释放了第一块内存" << endl;
pool[0] = 0;
return;
}
if (p == pool + 10)
{
cout << "释放了第二块内存" << endl;
pool[9] = 0;
return;
}
free(p);
}
};
char* people::pool = 0;//静态变量只能在内外初始化
int main()
{
if (people::intpool() == false) { cout << "初始化内存池失败。\n"; return -1; }
people* p1 = new people(173, 88); // 将使用内存池的第一个位置。
cout << "p1的地址是:" << p1 << ",身高:" << p1->tall << ",体重:" << p1->weight << endl;
people* p2 = new people(184, 74); // 将使用内存池的第二个位置。
cout << "p2的地址是:" << p2 << ",身高:" << p2->tall << ",体重:" << p2->weight << endl;
people* p3 = new people(166, 59); // 将使用系统的内存。
cout << "p3的地址是:" << p3 << ",身高:" << p3->tall << ",体重:" << p3->weight << endl;
delete p1; // 将释放内存池的第一个位置。
people* p4 = new people(155, 43); // 将使用内存池的第一个位置。
cout << "p4的地址是:" << p4 << ",身高:" << p4->tall << ",体重:" << p4->weight << endl;
delete p2; // 将释放内存池的第二个位置。
people* p5 = new people(199, 82); // 将使用内存池的第二个位置。
cout << " p5的地址是:" << p5 << ",身高:" << p5->tall << ",体重:" << p5->weight << endl;
delete p3; // 将释放系统的内存。
delete p4; // 将释放内存池的第一个位置。
people::freepool(); // 释放内存池。
}
运行结果:
申请大小为18的内存,取两位(0,9)为标志位,1为内存已占用,0为未占用,可以存放4个整形数据;
在重载的运算符new中,如果标志位(0,9)为零则分配内存给标志位的下一位(1,10),内存地址加一,并将标志位置为1,表示内存池的这片内存已被使用;
在重载的运算符delete中,如果传入的地址是标志位的后一位(1,10),则将标志位置为0,清空内存,超出内存池大小后将向系统申请内存;
内存池按顺序使用,哪里有空用哪里,除非内存池已满,不然不会申请系统内存
本人对内存池的理解还不够深入,只能了解其表面,各位读者见谅,以后深入学习时再进行补充
本文章主要回顾的知识点有:内存池,重载运算符,数据结构