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

Posted

技术标签:

【中文标题】malloc() 和 free() 在哪里存储分配的大小和地址?【英文标题】:Where do malloc() and free() store allocated sizes and addresses? 【发布时间】:2010-10-25 12:23:14 【问题描述】:

malloc()free() 在哪里存储分配的地址及其大小(Linux GCC)?我读过一些实现将它们存储在实际分配的内存之前的某个位置,但我无法在我的测试中确认。

背景,也许有人对此有另一个提示:

我正在尝试分析一个进程的堆内存,以确定另一个进程中字符串的当前值。 访问进程堆内存并浏览它是没有问题的。但是,由于字符串的值发生变化,并且进程每次都分配新的内存部分,因此字符串的地址发生了变化。因为字符串具有固定格式,仍然很容易找到,但经过一些更改后,字符串的旧版本仍然在堆内存中(可能已释放,但仍未重用/覆盖),因此我无法判断哪个字符串是当前字符串。

所以,为了仍然找到当前字符串,我想通过将其地址与malloc()free() 知道的地址进行比较来检查我在内存中找到的字符串是否仍在使用。

乔, 埃尔玛

【问题讨论】:

在下面我的回答中,这可能会有所帮助linuxforums.org/forum/linux-programming-scripting/… 您可能还想深入了解内核/glibc 的内存映射部分 【参考方案1】:

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

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

【讨论】:

又好又简洁,我很难理解艾登的奇怪回答,我真的不认为他回答了。【参考方案2】:

当然,这取决于标准库的实现。所以你最好的选择可能是挖掘库的源代码(glibc 是 Linux 上的默认值),看看你是否能弄清楚。这可能不会是微不足道的。

【讨论】:

以上是关于malloc() 和 free() 在哪里存储分配的大小和地址?的主要内容,如果未能解决你的问题,请参考以下文章

分配内存malloc()和free()

数据结构-堆栈动态存储

malloc/free函数

浅谈new/delete和malloc/free的用法与区别

C 存储空间的分配和释放

堆的分配和释放(malloc,free,calloc,realloc)