Где Do malloc()/free() Сохраняет выделенные размеры и адреса?

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

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

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

чао, Эльмар

Ответ 1

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

Чтобы узнать, как это делает библиотека C в Linux (glibc), получите исходный код http://ftp.gnu.org/gnu/glibc/ и посмотрите на malloc/malloc.c. Существует некоторая документация сверху, и она ссылается на A Memory Allocator от Doug Lea.

Ответ 2

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