Я в настоящее время пишу маленькое пользовательское Средство выделения памяти в C++ и хочу использовать его вместе с перегрузкой оператора new
/ delete
. Так или иначе мое Средство выделения памяти в основном проверяет, ли требуемая память по определенному порогу и раз так использует malloc для выделения требуемого блока памяти. Иначе память будет обеспечена некоторыми fixedPool
средства выделения. это обычно работает, но для моего освобождения функция похожа на это:
void MemoryManager::deallocate(void * _ptr, size_t _size){
if(_size > heapThreshold)
deallocHeap(_ptr);
else
deallocFixedPool(_ptr, _size);
}
Таким образом, я должен обеспечить, размер блока указал, для освобождения от правильного места.
Теперь проблема состоит в том, что удалить ключевое слово не обеспечивает подсказки на размере удаленного блока, таким образом, мне было бы нужно что-то вроде этого:
void operator delete(void * _ptr, size_t _size){
MemoryManager::deallocate(_ptr, _size);
}
Но насколько я вижу, нет никакого способа определить размер в операторе delete. - Если бы я хочу сохранить вещи путем, это прямо сейчас, я должен был бы сохранить размер блоков памяти сам?
выделяют больше памяти, чем необходимо, и хранят в ней информацию о размере. Вероятно, это то, что ваш системный распределитель уже делает. Примерно так (для простоты продемонстрируйте с помощью malloc):
void *allocate(size_t size) {
size_t *p = malloc(size + sizeof(size_t));
p[0] = size; // store the size in the first few bytes
return (void*)(&p[1]); // return the memory just after the size we stored
}
void deallocate(void *ptr) {
size_t *p = (size_t*)ptr; // make the pointer the right type
size_t size = p[-1]; // get the data we stored at the beginning of this block
// do what you need with size here...
void *p2 = (void*)(&p[-1]); // get a pointer to the memory we originally really allocated
free(p2); // free it
}
Для типа класса C ++ уже поддерживает его напрямую. Для неклассовых типов вам необходимо сохранить размер вручную, как показано в другом решении.
struct MyClass {
void operator delete(void *p, size_t size) {
MemoryManager::deallocate(p, size);
}
};
Вы можете сохранить карту адресов памяти в соответствии с размером вашей памяти, выделенной пулом. Когда вы удаляете, проверьте, находится ли указатель на карте, если он удаляет этот размер, если он не вызывает обычное удаление.