¿Dónde están Malloc () / free () Almacenar tamaños y direcciones asignados?

donde do malloc () y free () almacenan las direcciones asignadas y sus tamaños (Linux GCC)? He leído que algunas implementaciones las guardan en algún lugar antes de la memoria real asignada, pero no pude confirmar eso en mis pruebas.

El fondo, tal vez alguien tiene otro consejo para esto: estoy experimentando un poco con el análisis de la memoria de montón de un proceso para determinar el valor actual de una cadena en el otro proceso. Acceder a la memoria del montón de proceso y pasear por ella no es un problema. Sin embargo, como el valor de la cadena cambia y el proceso asigna una nueva parte de la memoria cada vez, la dirección de la cadena cambia. Debido a que la cadena tiene un formato fijo, aún es fácil de encontrar, pero después de algunos cambios, las versiones anteriores de la cadena todavía están en la memoria del montón (probablemente liberado, pero aún no reutilizado / sobrescrito) y por lo tanto no puedo decir cual cadena es la actual.

Entonces, para poder encontrar el actual, quiero verificar si todavía se usa una cadena que encuentro en la memoria comparando su dirección con las direcciones malloc / free know.

ciao, Elmar

Hay muchas formas en que malloc / free puede almacenar el tamaño del área de memoria. Por ejemplo, podría almacenarse justo antes del área devuelta por malloc. O podría almacenarse en una tabla de búsqueda en otro lugar. O podría almacenarse implícitamente: algunas áreas podrían reservarse para tamaños específicos de asignaciones.

Para averiguar cómo lo hace la biblioteca C en Linux (glibc), obtenga el código fuente de http://ftp.gnu.org/gnu/glibc/ y mire el archivo malloc/malloc.c . Hay un poco de documentación en la parte superior, y se refiere a un Allocator de memoria de Doug Lea.

Esto depende de la implementación de la biblioteca estándar, por supuesto. Por lo tanto, su mejor opción sería buscar en la fuente de la biblioteca ( glibc es el valor predeterminado en Linux) y ver si puede resolverlo. Probablemente no sea trivial.