自由链表可以很好的利用内存池的自由空间去管理内存,用空闲的内存去存其他空闲内存的地址真是一个不错的点子。
#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;
}
};
如有不足还请大佬不吝赐教。