Где malloc () / free () хранит выделенные размеры и адреса? - PullRequest
15 голосов
/ 12 мая 2009

где malloc () и free () хранят выделенные адреса и их размеры (Linux GCC)? Я читал, что некоторые реализации хранят их где-то до фактической выделенной памяти, но я не смог подтвердить это в моих тестах.

Фон, может быть, у кого-то есть другой совет для этого: Я немного экспериментирую с анализом динамической памяти процесса, чтобы определить текущее значение строки в другом процессе. Доступ к памяти кучи процесса и ее перемещение не являются проблемой. Однако, поскольку значение строки изменяется, и процесс каждый раз выделяет новую часть памяти, адрес строки изменяется. Поскольку строка имеет фиксированный формат, ее все равно легко найти, но после нескольких изменений старые версии строки все еще находятся в динамической памяти (вероятно, освобождены, но все еще не использованы повторно / перезаписаны), и поэтому я не могу сказать какая строка является текущей.

Итак, чтобы найти текущую, я хочу проверить, используется ли все еще найденная в памяти строка, сравнивая ее адрес с адресами, которые знает malloc / free.

чао, Эльмар

Ответы [ 2 ]

12 голосов
/ 12 мая 2009

Существует множество способов, которыми malloc / free может хранить размер области памяти. Например, он может быть сохранен непосредственно перед областью, возвращенной malloc. Или это может быть сохранено в таблице поиска в другом месте. Или это может быть сохранено неявно: некоторые области могут быть зарезервированы для определенных размеров распределений.

Чтобы узнать, как это делает библиотека C в Linux (glibc), получите исходный код из http://ftp.gnu.org/gnu/glibc/ и посмотрите файл malloc/malloc.c. Вверху есть некоторая документация, и она ссылается на Распределитель памяти Дуга Ли.

1 голос
/ 12 мая 2009

Это, конечно, зависит от реализации стандартной библиотеки. Поэтому, вероятно, лучше всего покопаться в источнике библиотеки ( glibc по умолчанию в Linux) и посмотреть, сможете ли вы выяснить это. Это, вероятно, не будет тривиальным.

...