Я работаю над реализацией распределения памяти/памяти, и я настраиваю его в поместье, где только специальный тип объекта «Клиент» может рисовать из pool. Клиент может быть сконструирован непосредственно в пуле, или он может использовать пул для вызовов динамической памяти, или теоретически можно сделать оба. Я хотел был бы иметь возможность перегрузить оператор new и оператор удаляет таким образом, который будет называть мои пулы функциями «alloc()» и «free()», чтобы получить память, необходимую для построения объекта на.Использование оператора new и оператора delete с использованием собственного пула памяти/распределителя
Одна из основных проблем, которые возникают у меня, - это удалить мой оператор, чтобы освободить память, вызвав функцию pool-> 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, но я хотел бы сохранить свою кросс-платформу кода, если это вообще возможно.
Если у вас есть вопросы, которые помогут вам помочь мне, дайте мне знать.
И, конечно же, заранее заблаговременно всем, кто может помочь.
До сих пор мне нравится этот ответ. Я вижу, что вы отредактировали его примерно через час после того, как вы разместили его? Мне любопытно, что и почему вы изменили. Я помню, что есть некоторые элементы выравнивания байтов, и вы использовали союз для чего-то. Если вы не возражаете объяснить, что мне интересно, что вы там делали и почему? –
@AlexZywicki, что выровненное хранилище было бесполезным (A C++ 11 вещь не требуется здесь, я тоже изучаю) –