Проверка памяти Malloc, если смежный - PullRequest
0 голосов
/ 16 января 2019

Я реализую класс типа пула памяти. Один из методов выделяет B байтов памяти и возвращает на него пустой указатель, при этом внутренняя обработка буферов и перемещение по старой памяти обеспечивает непрерывность всей памяти, управляемой объектом во время его существования (аналогично тому, как будет иметься std :: vector). предварительно выделенный буфер и выделение дополнительного пространства после того, как буфер закончится, копируя информацию из старого буфера в новый, чтобы гарантировать непрерывность всей памяти). У меня вопрос, как я могу гарантировать, что вся выделенная память является непрерывной? Если я хочу перейти от объекта к объекту вручную, используя

static_cast<desired_type*>(buffer_pointer + N)

Этот метод, естественно, потерпит неудачу, если местоположение объекта будет смещено на некоторую величину, которая не является просто суммой размеров предыдущих объектов. Я новичок в написании пользовательских пулов памяти, поэтому мне просто интересно, как я могу убедиться, что выделенная память не фрагментирована, или получить доступ к расположению нового фрагмента, чтобы я мог вручную индексировать через блок malloc () - ed объем памяти? Спасибо.

1 Ответ

0 голосов
/ 16 января 2019

Если я понимаю ваш вопрос, вы спрашиваете, можете ли вы сделать несколько вызовов, чтобы malloc возвращала непрерывную память.

Ответ - нет, память не будет смежной между несколькими malloc, так как большинство менеджеров памяти размещают данные head / tail вокруг выделенной памяти как для собственного управления, так и для установки защитных маркеров по краям для обнаружения переполнений - подробности сильно зависит от реализации.

для вашего собственного управления памятью вам нужно выделить достаточно большой блок с помощью malloc, а затем разделить его и управлять внутренними компонентами самостоятельно.

Вы можете посмотреть на этот github proj как пример необходимого управления: https://github.com/bcorriveau/memblock

...