I2C存储器免费混乱

我有我的代码很短的问题。 我创建了检验两块情况或例子。

例1:

char *arr[1000000]; int i = 0; for (; i < 1000000; i++){ char *c = (char *) calloc(1, sizeof(char) * 10); free(c); }

实施例2:

char *arr[1000000]; int i = 0; for (; i < 1000000; i++){ char *c = (char *) calloc(1, sizeof(char) * 10); arr[i] = c; free(arr[i]); arr[i] = NULL; }

在示例型动物:将在数组free'ing之前的记忆。

当我运行示例1这是免费的所有内存。 当我运行例如二不释放所有内存。 我已经搜查,并期待,但不能弄明白。

为什么例子2不同,那么实例1的结果?

我的常识告诉我实施例1和2应产生相同的,但在实践中却没有。 我使用Linux上面检查内存使用情况。

--------------解决方案-------------

它是由需求造成的分页。 该方法具有对于阵列地址空间(即:对于它存在页表的条目),但没有连接到它(还)存储器。 循环分配给(最终)属于阵列[]中的所有存储器页,所以在循环结束时,所有页面已经被“断式”。

作为一个概念证明,可以用替换循环:

for (; i < 1000000; i++){
arr[i] = "hello, world!";
}

其结果可能会是(几乎)一样片段#2

结果是相同的。 我不知道为什么你认为有差异。

两者是相同的。

由于您使用top阅读记忆的差别可以用编译器优化来解释。 例如,例如,一种在该阵列可以完全优化的。

对于检查内存问题,您应该使用Valgrind的或类似的工具。

分类:C# 时间:2015-03-14 人气:0
本文关键词: 内存,可用
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.056 (s). 10 q(s)