2016-08-12 58 views
0
  1. 我运行C:释放calloc后内存使用不反映

    释放calloc(1024 * 1024 * 1024,的sizeof(INT));

  2. 我检查我的程序的使用,它是零,但是我从来不打了一个电话给free

编辑:

运行Debian杰西

编辑2:

我使用顶部作为系统监视器

+1

请提供有关您的问题的更多信息,例如您如何检查内存使用情况,这将有助于他人了解您的实际含义。 – oxnz

+0

你看过哪列?您确定顶级程序没有将内存使用量上下舍入到最接近的MB或十分之一MB? – nos

+0

所以我们应该猜猜你想要代码或什么?请看我看到的一些代码 – Michi

回答

5

Linux会执行懒惰的内存分配。只有当标记为分配的页面出现页面错误时,Linux才会将其视为正在使用。尝试写入分配的数据中的一个字节并再次检查内存使用情况。有关Linux中内存分配的更多信息,请检查http://www.tldp.org/LDP/tlk/mm/memory.html

此外,即使calloc归零分配的内存,它仍然可以以懒惰的方式完成,导致您所描述的行为。见How to lazy allocate zeroed memory?

+0

。将它改为4GB,并且当我将值设置为随机整数时,它才开始上升 – peter

1

您的示例仅分配了几个K,可能太小而无法看到。但即使你要求更大量的内存,在实际使用内存之前也不会看到使用情况。

默认情况下,Linux不会实际分配内存页面,除非您以某种方式触摸它们。虽然calloc应该将内存初始化为零,但这不会被视为触及它,因为内部会跟踪未初始化的页面,并在读取时返回零。

+1

但'calloc'初始化内存。 – peter

+0

查看mwk的回答。 calloc声称初始化内存,但作为现代Linux平台的优化,它只是利用了新分配的虚拟内存已经为零的事实。你本质上可以通过在这样的平台上使用malloc来获得零内存,但是由于你的代码可能被移植或者在不同的平台上运行,所以当期望具有零内存时,好的做法总是应该调用calloc真正。 – wojtow

+0

哦,我看到谢谢老兄 – peter