Использование оператора 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 прямо сейчас, но я хотел бы сохранить свой кросс-платформенный код, если это вообще возможно.

Если у вас есть какие-либо вопросы, которые помогут вам, дайте мне знать.

И конечно, заранее спасибо всем, кто может помочь.

Ответы на вопрос(3)

Ваш ответ на вопрос