C内存自由混乱

时间:2011-11-12 16:19:30

标签: c memory free

我对我的代码有一个简短的问题。我已经创建了两个用于测试的情况或示例。

示例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;
}

示例中的不同之处:在释放内存之前放入数组。

当我运行示例1时,它释放所有内存。当我运行示例2时,它不会释放所有内存。 我已经搜索过但看上去却无法理解。

为什么示例2的结果与示例1不同?

我的常识告诉我,示例1和2的结果应该相同,但实际上并非如此。我使用linux top来检查内存使用情况。

3 个答案:

答案 0 :(得分:4)

结果是一样的。我不确定你为什么认为存在差异。

答案 1 :(得分:3)

两者都是一样的。

由于您使用top来读取内存,因此可以使用编译器优化来解释差异。例如,可以完全优化示例1中的数组。

要检查内存问题,您应该使用valgrind或类似的工具。

答案 2 :(得分:3)

这是由请求分页引起的。该进程具有数组的地址空间(即:存在可用的分页表条目),但尚未附加内存(尚未)。循环分配给(最终)所有属于array []的内存页面,因此在循环结束时所有页面都被“故障”。

作为概念证明,您可以用以下代码替换循环:

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

结果可能(几乎)与片段#2相同