I am writing a memory manager in c++. The aim is to allocate a set amount of memory at the start using malloc and then overload new and delete so that it uses that memory. I almost have it working my only problem is how i am keeping track of what is where in the memory.
I created a vector of structs which holds information such as size, location and if it is free or not.
The problem is when i call push_back it attempts to use my overloaded new function. This is where it fails because it can’t use my overloaded new until it has pushed back the first structure of information.
Does anyone know how i can resolve this or a better way to keep track of the memory?
Don’t overload global
operator new!The easiest and (WARNING; subjective ->) best solution would be to define your own Allocator which you’ll use when dealing with allocation on the free-store (aka. heap). All STL containers have support for passing an AllocatorType as a template argument.
Overloading global
operator new/operator deletemight seem like a neat solution, but I can almost guarantee you that it will cause you troubles as the developing goes by.Inside this custom made allocator you can keep track of what goes where, but make the internal
std::vector(or whatever you’d like to use, astd::mapseems more fitting to me) will use the defaultoperator new/operator delete.How do I create my own allocator?
The link below will lead you to a nice document with information regarding this matter:
Using a custom allocator when required/wanted will make you not run into any chicken and egg problem when trying to allocate memory for the allocator that will allocate memory, but the allocator must have allocated memory to use the allocator methods.. and what will allocate memory for the allocator but the allocator? Well we will need to allocate memory for that allocator and that allocator must have it’s own allocator, though that allocator need memory, provided by another allocator?
Maybe I should just get myself a dog instead, they don’t lay eggs – right?