为什么内存不会从malloc中清零?

我在书中读到:

动态内存分配器维护着称为堆的进程的虚拟内存区域。 细节因系统而异,但不失一般性,我们将假定堆是一个需求为零的区域,在未初始化的bss区域之后立即开始并向上(向更高的地址)增长。

所以,我很困惑为什么堆的内存不是用零初始化的。 更准确地说,我的意思是由malloc返回的一块内存。


本书描述的是内存分配如何工作的例子。 这是一个非常常见的例子,但有些平台的工作方式不同。 它描述了一个具有虚拟内存的多任务平台。

多任务平台上的内存分配有两个方面:首先,任务从操作系统接收一些内存; 那么任务本身管理自己的记忆。 你引用的段落描述了第一步。

在这个典型的平台上,当任务要求操作系统获得更多的内存时(通过对内核进行系统调用,例如通过传统的Unix系统上的brk系统调用),操作系统的内核会发现一些物理内存“由任何其他任务使用,在内部数据结构中将其标记为正在使用,并在称为BSS或堆的连续虚拟地址段末尾的任务内存映射中引用它们。 此外,该内存被清零,以便该任务不会读取其他任务遗留的一些数据。

malloc函数通过分配堆区域的块来工作。 它完全在任务的堆内工作。 如果堆满了,它只会进行系统调用以获得更多内存。 在大多数平台上, malloc函数不会覆盖它分配的内存以提高性能。 所以当从操作系统中获得第一次使用的内存块时,它就会被清零。 但是,如果内存已经被里面的任务使用,因为它已经与获得malloc ,然后释放free ,和通过其他重复使用malloc ,那么内存将包含任何任务围绕放在那里第一次。


长话短说,因为malloc()不是这样设计的。

当从堆中分配内存时,它只是返回一个指向内存的指针,它不会关心内存位置的(现有)内容。 如果内存先前被某个其他调用分配然后释放,那么实际内存仍有可能保留先前的数据。 相同的内存位置,如果通过下一次调用malloc()重新分配,它可能包含旧数据(在最后一次调用中变得不确定)。 它实际上节省了清零分配内存的开销。

当你立即要覆盖分配的内存时, malloc()可以为你节省一个不必要的开销来清零内存位置。

OTOH, calloc()会对分配的内存进行零初始化,如果需要的话。

链接地址: http://www.djcxy.com/p/14511.html

上一篇: Why memory isn't zero out from malloc?

下一篇: Reference of a Heap