为什么内存不会从malloc中清零?
我在书中读到:
动态内存分配器维护着称为堆的进程的虚拟内存区域。 细节因系统而异,但不失一般性,我们将假定堆是一个需求为零的区域,在未初始化的bss区域之后立即开始并向上(向更高的地址)增长。
所以,我很困惑为什么堆的内存不是用零初始化的。 更准确地说,我的意思是由malloc返回的一块内存。
本书描述的是内存分配如何工作的例子。 这是一个非常常见的例子,但有些平台的工作方式不同。 它描述了一个具有虚拟内存的多任务平台。
多任务平台上的内存分配有两个方面:首先,任务从操作系统接收一些内存; 那么任务本身管理自己的记忆。 你引用的段落描述了第一步。
在这个典型的平台上,当任务要求操作系统获得更多的内存时(通过对内核进行系统调用,例如通过传统的Unix系统上的brk
系统调用),操作系统的内核会发现一些物理内存“由任何其他任务使用,在内部数据结构中将其标记为正在使用,并在称为BSS或堆的连续虚拟地址段末尾的任务内存映射中引用它们。 此外,该内存被清零,以便该任务不会读取其他任务遗留的一些数据。
malloc
函数通过分配堆区域的块来工作。 它完全在任务的堆内工作。 如果堆满了,它只会进行系统调用以获得更多内存。 在大多数平台上, malloc
函数不会覆盖它分配的内存以提高性能。 所以当从操作系统中获得第一次使用的内存块时,它就会被清零。 但是,如果内存已经被里面的任务使用,因为它已经与获得malloc
,然后释放free
,和通过其他重复使用malloc
,那么内存将包含任何任务围绕放在那里第一次。
长话短说,因为malloc()
不是这样设计的。
当从堆中分配内存时,它只是返回一个指向内存的指针,它不会关心内存位置的(现有)内容。 如果内存先前被某个其他调用分配然后释放,那么实际内存仍有可能保留先前的数据。 相同的内存位置,如果通过下一次调用malloc()
重新分配,它可能包含旧数据(在最后一次调用中变得不确定)。 它实际上节省了清零分配内存的开销。
当你立即要覆盖分配的内存时, malloc()
可以为你节省一个不必要的开销来清零内存位置。
OTOH, calloc()
会对分配的内存进行零初始化,如果需要的话。
上一篇: Why memory isn't zero out from malloc?
下一篇: Reference of a Heap