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 如何从操作系统请求内存,通常是通过调用 sbrk
或 mmap
。但这当然是定义的实现。
【讨论】:
【参考方案2】:如果您想查看实现,请查找 glibc,它是 C 标准库的 GNU 实现,其中包括内存管理功能。但请注意,在其他平台上实现的具体细节会有所不同,并且可能会在标准库的版本之间发生变化。
【讨论】:
【参考方案3】:malloc
和 free
的工作方式是由实现定义的。通常,有关内存块的信息将存储在 ptr
下方的标头中。但不一定。
malloc
和free
的优点在于您无需了解它们的工作原理。系统会为您处理详细信息。
我在某处读到使用相同的指针参数调用 free 两次会导致未定义的行为。为了理解这一点,我必须首先知道免费是如何工作的?
我不确定我是否同意这种说法。你只需要遵守规则。
当我们调用malloc/calloc/realloc时,堆是否总是分配连续的内存?
如果您的意思是返回的内存块在地址空间中是连续的,那么是的。如果您的意思是连续分配是顺序的,那么不是。
【讨论】:
感谢您的回答。你能告诉我在哪里可以找到 gcc(或其他一些著名的编译器)是如何免费实现的吗?为至少一个编译器学习这一点会很棒。 编译器没有实现free。 libc 可以。 @Bruce 您可以在此处阅读有关一种内存分配器的信息:g.oswego.edu/dl/html/malloc.html @Bruce,仅供参考,虽然从malloc
返回的内存在您的地址空间中是连续的,但它可能在物理上并不连续,但这是您通常不需要的操作系统问题关心。
“malloc 和 free 的好处在于你不需要知道它们是如何工作的。”哦,有争议!以上是关于malloc 和 free 在 C 中是如何实现的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章