2011-10-09 62 views
1

可能重复:
How do malloc() and free() work?malloc和free是如何在C中实现的?

我读的地方,呼吁免费使用相同的指针参数两次会导致不确定的行为。那么免费怎么知道它有多少内存要释放?当我们调用malloc/calloc/realloc时,堆总是分配连续的内存吗?请提供相关文章/帖子/博客等的链接。

+1

你并不需要知道自由工作是如何理解的。只要你记得在指针上释放后,你不再拥有该位置的内存。尝试访问它,你会受到惩罚。 – 2011-10-09 20:48:53

+0

@WTP:我只是好奇它如何在引擎盖下工作。 – Bruce

+2

也许你应该改变你的问题,说你想知道如何实现malloc/free。声明“为了理解这一点,我必须先了解自由作品”是否有误导性。 –

回答

5

如何mallocfree工作是实现定义的。通常有关内存块的信息将存储在低于ptr的标题中。但不一定。

关于mallocfree的好处是您不需要知道它们是如何工作的。系统为您处理细节。

我读了一个地方,使用相同的指针参数调用两次空闲导致未定义的行为。为了理解这一点,我必须首先知道自由的工作方式?

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

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

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

+0

谢谢你的回答。你能告诉我在哪里可以找到gcc(或者其他一些众所周知的编译器)如何实现免费的吗?至少为一个编译器学习这将是一件好事。 – Bruce

+0

编译器不实现免费。 libc的确如此。 – arsenm

+1

@Bruce你可以在这里阅读关于一个内存分配器的内容:http://g.oswego.edu/dl/html/malloc.html –

0

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

1

您可以阅读关于tcmalloc页面上的示例实现。这是相对短而直接:http://goog-perftools.sourceforge.net/doc/tcmalloc.html(跳转到概述)

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