内存池学习日记 1 自由链表

自由链表可以很好的利用内存池的自由空间去管理内存,用空闲的内存去存其他空闲内存的地址真是一个不错的点子。

#pragma once

template<class T>
class MemoryPool {
private:
	char* Memory;
	void* Freelist;
	size_t Memory_size;
	size_t t_size;
public:
	MemoryPool():Memory(nullptr),Freelist(nullptr) {
		t_size = sizeof(T) > 8 ? sizeof(T) : 8;
	}
	T* malloc() {
		T* Obj = nullptr;
		if (Freelist != nullptr) {
			Obj = (T*)Freelist;
			Freelist = *(void**)Freelist;
		}
		else {
			if (Memory == nullptr || Memory_size < t_size) {
				Memory = (char*)::operator new(10 * t_size);
				Memory_size = 10 * t_size;
			}
			Obj = (T*)Memory;
			Memory += t_size;
			Memory_size -= t_size;
		}
		new(Obj)T;
		return Obj;
	}

	void free(T* p) {
		if (p == nullptr)
			return;
		p->~T();
		*(void**)p = Freelist;
		Freelist = p;
		p = nullptr;
	}
};

如有不足还请大佬不吝赐教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值