У меня есть собственный класс распределителя, который выглядит примерно так:
class allocator {
private:
char* memory;
std::ptrdiff_t offset;
std::size_t total_size;
public:
allocator(std::size_t size) : total_size(size), offset(0) {
memory = new char[size];
}
void* allocate(std::size_t size, std::size_t alignment) {
// unimportant stuff
void* current_address = &start_ptr[offset]; // --> OUCH, pointer arithmethic
offset += size;
// unimportant stuff
return current_address;
}
}
Как вы можете видеть выше, я использую арифметику указателей для вычисления текущего адреса для вновь выделенного блока памяти. В CppCoreGuidelines и во многих других рекомендациях не рекомендуется использовать арифметику указателей. Так есть ли другой способ управления пулом памяти?
Я думал о том, чтобы, возможно, использовать std::vector<char>
, поскольку он содержит непрерывный блок памяти, и делать что-то вроде этого:
std::vector<char> memory;
void* current_address = &(memory.at(offset));
Но мне это не кажется приятнее. У вас есть какие-либо идеи о том, как безопасно управлять пулом памяти безопасным способом?