Перегрузка удалить и восстановить размер? - PullRequest
5 голосов
/ 03 апреля 2010

В настоящее время я пишу небольшой собственный распределитель памяти на C ++ и хочу использовать его вместе с перегрузкой операторов new / delete. В любом случае, мой распределитель памяти в основном проверяет, превышает ли запрошенная память определенный порог, и, если это так, использует malloc для выделения запрошенного фрагмента памяти. В противном случае память будет обеспечиваться некоторыми fixedPool распределителями. это обычно работает, но для моей функции освобождения выглядит так:

void MemoryManager::deallocate(void * _ptr, size_t _size){
    if(_size > heapThreshold)
        deallocHeap(_ptr);
    else 
        deallocFixedPool(_ptr, _size);
}

Итак, мне нужно указать размер куска, на который нужно освободить место.

Теперь проблема в том, что ключевое слово delete не дает никаких подсказок о размере удаленного чанка, поэтому мне нужно что-то вроде этого:

void operator delete(void * _ptr, size_t _size){ 
    MemoryManager::deallocate(_ptr, _size); 
}

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

Ответы [ 4 ]

5 голосов
/ 03 апреля 2010

выделяет больше памяти, чем необходимо, и сохраняет там информацию о размере. Это то, что ваш распределитель системы, вероятно, уже делает. Примерно так (продемонстрируйте с помощью 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
}
2 голосов
/ 08 июня 2015

Начиная с C ++ 14 Стандарт поддерживает второй параметр size в глобальной функции распределения delete . Так что хотеть, что ты хочешь сделать, возможно уже сейчас.

http://en.cppreference.com/w/cpp/memory/new/operator_delete

2 голосов
/ 03 апреля 2010

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

struct MyClass {
  void operator delete(void *p, size_t size) {
    MemoryManager::deallocate(p, size);
  }
};
2 голосов
/ 03 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...