我在某处读到使用相同指针参数自由调用两次会导致未定义的行为。那么免费如何知道它必须释放多少内存?当我们调用malloc / calloc / realloc时,堆是否总是分配连续的内存?请提供相关文章/帖子/博客等的链接。
答案 0 :(得分:5)
malloc
和free
如何工作是实施定义的。通常,有关内存块的信息将存储在ptr
下方的标题中。但不一定。
关于malloc
和free
的好处是你不需要知道它们是如何工作的。系统会为您处理细节。
我在某处读到使用相同指针参数自由调用两次会导致未定义的行为。为了理解这一点,我首先必须知道免费是如何工作的?
我不确定我同意这个说法。你只需要遵守规则。
当我们调用malloc / calloc / realloc时,堆是否总是分配连续的内存?
如果你的意思是返回的内存块在地址空间中是连续的,那么是的就是这样。如果你的意思是连续的分配是顺序的,那么没有。
答案 1 :(得分:1)
您可以在tcmalloc页面上阅读有关示例实现的信息。它相对简短直接:http://goog-perftools.sourceforge.net/doc/tcmalloc.html(跳到概述)
如果您想知道malloc如何从操作系统请求内存,通常可以通过调用sbrk
或mmap
来实现。但当然,这是实施的定义。
答案 2 :(得分:0)
如果要查看实现,请查找glibc,它是C标准库的GNU实现,其中包括内存管理功能。但请注意,实现的确切细节在其他平台上会有所不同,并且可能会在标准库的版本之间发生变化。