Перегрузка удаляет и размер получения?

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

5
задан Unihedron 11 August 2014 в 09:59
поделиться

3 ответа

выделяют больше памяти, чем необходимо, и хранят в ней информацию о размере. Вероятно, это то, что ваш системный распределитель уже делает. Примерно так (для простоты продемонстрируйте с помощью 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
}
5
ответ дан 13 December 2019 в 19:24
поделиться

Для типа класса C ++ уже поддерживает его напрямую. Для неклассовых типов вам необходимо сохранить размер вручную, как показано в другом решении.

struct MyClass {
  void operator delete(void *p, size_t size) {
    MemoryManager::deallocate(p, size);
  }
};
2
ответ дан 13 December 2019 в 19:24
поделиться

Вы можете сохранить карту адресов памяти в соответствии с размером вашей памяти, выделенной пулом. Когда вы удаляете, проверьте, находится ли указатель на карте, если он удаляет этот размер, если он не вызывает обычное удаление.

2
ответ дан 13 December 2019 в 19:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: