malloc 和 free 在 C 中是如何实现的? [复制]

Posted

技术标签:

【中文标题】malloc 和 free 在 C 中是如何实现的? [复制]【英文标题】:How are malloc and free implemented in C? [duplicate] 【发布时间】:2011-12-04 02:54:12 【问题描述】:

可能重复:How do malloc() and free() work?

我在某处读到使用相同的指针参数调用 free 两次会导致未定义的行为。那么 free 如何知道它需要释放多少内存呢?当我们调用 malloc/calloc/realloc 时,堆是否总是分配连续的内存?请提供相关文章/帖子/博客等的链接。

【问题讨论】:

你不需要知道免费是如何工作的就可以理解这一点。只要您记得在指针上调用 free 之后,您就不再拥有该位置的内存。尝试访问它,你会受到惩罚。 @WTP:我只是好奇它是如何工作的。 也许你应该改变你的问题,说你想知道 malloc/free 是如何实现的。 “为了理解这一点,我必须首先了解免费的工作原理”这句话具有误导性。 这不是 完全 一个重复,所以我不会投票结束,但之前关于 SO 的答案可能会回答你的很多问题:***.com/questions/1119134/how-do-malloc-and-free-work 【参考方案1】:

您可以在 tcmalloc 页面上阅读示例实现。它相对简短直接:http://goog-perftools.sourceforge.net/doc/tcmalloc.html(跳至概览)

如果您想知道 malloc 如何从操作系统请求内存,通常是通过调用 sbrkmmap。但这当然是定义的实现。

【讨论】:

【参考方案2】:

如果您想查看实现,请查找 glibc,它是 C 标准库的 GNU 实现,其中包括内存管理功能。但请注意,在其他平台上实现的具体细节会有所不同,并且可能会在标准库的版本之间发生变化。

【讨论】:

【参考方案3】:

mallocfree 的工作方式是由实现定义的。通常,有关内存块的信息将存储在 ptr 下方的标头中。但不一定。

mallocfree 的优点在于您无需了解它们的工作原理。系统会为您处理详细信息。

我在某处读到使用相同的指针参数调用 free 两次会导致未定义的行为。为了理解这一点,我必须首先知道免费是如何工作的?

我不确定我是否同意这种说法。你只需要遵守规则。

当我们调用malloc/calloc/realloc时,堆是否总是分配连续的内存?

如果您的意思是返回的内存块在地址空间中是连续的,那么是的。如果您的意思是连续分配是顺序的,那么不是。

【讨论】:

感谢您的回答。你能告诉我在哪里可以找到 gcc(或其他一些著名的编译器)是如何免费实现的吗?为至少一个编译器学习这一点会很棒。 编译器没有实现free。 libc 可以。 @Bruce 您可以在此处阅读有关一种内存分配器的信息:g.oswego.edu/dl/html/malloc.html @Bruce,仅供参考,虽然从malloc 返回的内存在您的地址空间中是连续的,但它可能在物理上并不连续,但这是您通常不需要的操作系统问题关心。 “malloc 和 free 的好处在于你不需要知道它们是如何工作的。”哦,有争议!

以上是关于malloc 和 free 在 C 中是如何实现的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

malloc 和 free 是如何实现的?

如何实现一个malloc

Unix系统编程()malloc和free的实现

C语言中已经有了malloc和free,为啥还需要new和delete?

如何使用 malloc 和 free 进行动态内存分配

c语言中,malloc和free是啥意思?