定长内存池

写一个定长内存池!

#pragma once
#include <iostream>
using std::cout;
using std::endl;

// 定长内存池!
// template<size_t N>
// class ObjectPool {};

/*
		左值 和 右值
		左值 : 在 '='左边的,实际是变量的内存所在内容要被覆盖!
		右值 : 在 '=' 右边的,实际是变量所在内存的内容要被取出!
*/
template<class T>
class ObjectPool {

public:
	T* New() {
		T* obj = nullptr;
		if (_freeList) {// 释放的内存还在! 进行头删!
			void* next = *(void**)_freeList; // 指针中的内容给next指针
			obj = _freeList;
			freeList = next;
			new (obj)T;
			return obj;
		}
		if (residualSize < sizeof(T)) { // 剩余的内存不够分了!
			residualSize = 128 * 1024;
			_memory = malloc(residualSize); // 再申请一块!
			if (_memory == nullptr) { // 内存申请失败!
				throw std::bad_alloc(); // 抛异常,终止程序!
			}
		}

		obj = (T*)_memory; // 切一块内存给他!

		// 确保申请的内存可以以链表的形式组织起来!
		size_t obj_size = sizeof(T) > sizeof(void*) ? sizeof(T) : sizeof(void*);
		_memory += obj_size;
		residualSize -= obj_size();

		new (obj)T; // 初始化内存!
		return obj;
	}

	void Delete(T* obj) { // 释放内存!
		obj->~T(); // 显示调用对象析构函数!
		// 将释放的内存取一个指针大小的空间存放下一个节点的地址!
		*(void**)obj = _freeList; // 取obj所指向的内存的前(存下指针长度)的字节的内存做next指针的内存!
		_freeList = obj;
	}

private:
	char* _memory = nullptr; // 申请的内存的首地址!
	void* _freeList = nullptr; // 释放内存的链表头指针!
	size_t residualSize = 0;     // 剩余内存大小!
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值