C++内存池实现

内存池的实现:

  在堆内存中申请一大块内存当作内存模块,为了避免内存块的使用浪费,将内存模块根据所装载的内存块大小,分为不同的内存池。

定义一个结构体用来表示内存块信息,定义节点指针,方便内存块使用与归还,定义内存池标记表示是否属于内存池中的内存单元(当内存池中的内存单元使用完毕后,向系统申请的标记)。

//内存信息块的结构
typedef struct stMemoryBlock
{
	MemoryPool* pPoool;//当前的内存块属于哪一个内存池
	stMemoryBlock* pNext;//节点指针
	bool isInPool;//表示这个内存块是否属于池内存
}MEMORY_BLOCK, * LP_MEMORY_BLOCK;

内存池类的实现

//内存池类
class MemoryPool
{
	MemoryPool(const MemoryPool&) = delete;
	MemoryPool& operator = (const MemoryPool&) = delete;
public:
	MemoryPool();
	virtual ~MemoryPool();
	//初始化内存池
	bool InitPool();
	//对池子中申请内存
	void* MemAlloc(size_t size);
	//从池子中释放内存
	void MemFree(void* pMem);
protected:
private:
	char* _pPoolBuffer;//整个内存池的内存的指针,指向一大块堆内存
	LP_MEMORY_BLOCK _pHeader;//池子中内存块链表的头部
	size_t _nSize;//表示的是内存单元的大小
	size_t _nBlockCount;//内存单元数量
	std::mutex _mutex;  //预防在多线程中节点指针的使用
};

内存池的初始化申请内存 内存池链表进行连接

内存池当中的内存块大小 = 单元内存块大小+描述信息(结构体)

bool MemoryPool::InitPool()
{
    if (_pPoolBuffer) { return true; }//避免重复的初始化
    //计算出需要申请多少内存
    //真正的内存块的大小 = 单元内存块大小+描述信息(结构体)
    size_t realsize = _nSize + sizeof(MEMORY_BLOCK);
    //内存池的大小 = 真正的内存块的大小*内存块数量
    size_t bufsize = realsize * _nBlockCount;
    //一次性申请一大块内存池内存
    _pPoolBuffer = (char*)malloc(bufsize);
    if (_pPoolBuff
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值