malloc()和free()在哪里存储分配的大小和地址?

18
malloc()free()(Linux GCC)在哪里存储已分配地址及其大小?我读到有些实现将它们存储在实际分配的内存之前的某个地方,但我无法在我的测试中确认这一点。
背景:也许有人对此有其他提示: 我正在尝试通过分析进程的堆内存来确定另一个进程中字符串的当前值。访问进程堆内存并浏览其中的内容不是问题。但是,由于字符串的值会发生变化,并且进程每次分配新的一部分内存,因此字符串的地址会发生变化。因为该字符串具有固定格式,所以仍然很容易找到,但经过几次更改后,旧版本的字符串仍然存在于堆内存中(可能已被释放,但仍未被重用/覆盖),因此我无法确定哪个字符串是当前的字符串。
因此,为了仍然找到当前字符串,我想通过将我在内存中发现的字符串的地址与malloc()free()知道的地址进行比较来检查该字符串是否仍在使用。

以下是我的回答,这可能会有所帮助 http://www.linuxforums.org/forum/linux-programming-scripting/52375-reading-memory-other-processes.html - Aiden Bell
你可能还想深入了解内核/Glibc的内存映射部分。 - Aiden Bell
2个回答

15

malloc/free有很多种方式可以存储内存区域的大小。例如,它可能仅存储在malloc返回的区域之前。或者它可能存储在其他地方的查找表中。或者它可能被隐式存储:一些区域可能被保留用于特定大小的分配。

要了解Linux(glibc)中C库如何实现这一点,请从http://ftp.gnu.org/gnu/glibc/获取源代码,并查看malloc/malloc.c文件。顶部有一些文档,并引用了Doug Lea的A Memory Allocator


1
很好,简明扼要。我很难理解艾登奇怪的回答,我认为他根本没有回答。 - RandomNickName42

1

当然,这取决于标准库的实现。所以你最好是挖掘一下库的源代码(glibc 是 Linux 上的默认库),看看能否弄清楚。这可能并不是一件容易的事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接