Использование оператора new и оператора delete с пользовательским пулом памяти / распределителем
я работаю над реализацией пула памяти / распределителя памяти, и я устанавливаю его в поместье, где только специальное "Клиент» Тип объекта может извлекаться из пула. Клиент может быть сконструирован непосредственно в пуле, или он может использовать пул для динамических вызовов памяти, или теоретически он может делать и то и другое. Я хотел бы иметь возможность перегружатьоператор новый а такжеоператор удаления таким образом, что бы назвать мои бассейны "Alloc ()» а также "свободно()" функции для того, чтобы получить память, необходимую для создания объекта.
Одна из основных проблем, с которыми я сталкиваюсь, - это удаление оператора, чтобы можно было освободить память, вызвав пул->Функция free (), которую я написал. Я придумал хак, который исправляет это, передавая пул в конструктор и заставляя деструктор выполнять работу по освобождению. Это все прекрасно, пока кто-то не должен унаследовать от этого класса и переопределить деструктор для своих нужд, а затем забыть об освобождении памяти. Вот почему я хочу обернуть все это в операторах, чтобы функциональность была скрыта и унаследована по умолчанию.
Мой код находится на GitHub здесь:https://github.com/zyvitski/Pool
Мое определение класса для Клиента следующее:
class Client
{
public:
Client();
Client(Pool* pool);
~Client();
void* operator new(size_t size,Pool* pool);
void operator delete(void* memory);
Pool* m_pPool;
};
И реализация:
Client::Client()
{
}
Client::Client(Pool* pool)
{
m_pPool = pool;
}
Client::~Client()
{
void* p = (void*)this;
m_pPool->Free(&p);
m_pPool=nullptr;
}
void* Client::operator new(size_t size, Pool* pool)
{
if (pool!=nullptr) {
//use pool allocator
MemoryBlock** memory=nullptr;
memory = pool->Alloc(size);
return *memory;
}
else throw new std::bad_alloc;
}
void Client::operator delete(void* memory)
{
//should somehow free up the memory back to the pool
// the proper call will be:
//pool->free(memory);
//where memory is the address that the pool returned in operator new
}
Вот пример Main (), который ям на данный момент:
int main(int argc, const char * argv[]){
Pool* pool = new Pool();
Client* c = new(pool) Client(pool);
/*
I'm using a parameter within operator new to pass the pool in for use and i'm also passing the pool as a constructor parameter so i can free up the memory in the destructor
*/
delete c;
delete pool;
return 0;
}
Пока мой код работает, но я хочу знать, есть ли лучший способ добиться этого? Пожалуйста, дайте мне знать, если что-то, что я спрашиваю / делаю, просто невозможно, плохая практика или просто глупость. Я нахожусь на MacBook Pro прямо сейчас, но я хотел бы сохранить свой кросс-платформенный код, если это вообще возможно.
Если у вас есть какие-либо вопросы, которые помогут вам, дайте мне знать.
И конечно, заранее спасибо всем, кто может помочь.