C++内存池

文章介绍了内存池的概念,通过一个简单的C++类`people`展示了如何重载`operatornew`和`operatordelete`来实现内存池。内存池预先分配了一片内存,当创建`people`对象时,优先从内存池中分配空间,池内无空闲空间时才向系统申请内存。在对象删除时,会将内存归还给内存池。此外,文章还提及了内存池的顺序使用原则和标志位机制。
摘要由CSDN通过智能技术生成

内存池是一种动态内存分配与管理技术,用于快速分配内存和内存归还;提前分配一片内存给内存池,需要使用内存时借用内存池的内存,使用后归还给内存池;内存池用到之前重载运算符的知识,以下是一个简单的内存池:

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,清空内存,超出内存池大小后将向系统申请内存;

内存池按顺序使用,哪里有空用哪里,除非内存池已满,不然不会申请系统内存

本人对内存池的理解还不够深入,只能了解其表面,各位读者见谅,以后深入学习时再进行补充

本文章主要回顾的知识点有:内存池,重载运算符,数据结构

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值