我对我的代码有一个简短的问题。我已经创建了两个用于测试的情况或示例。
示例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来检查内存使用情况。
答案 0 :(得分:4)
结果是一样的。我不确定你为什么认为存在差异。
答案 1 :(得分:3)
两者都是一样的。
由于您使用top
来读取内存,因此可以使用编译器优化来解释差异。例如,可以完全优化示例1中的数组。
要检查内存问题,您应该使用valgrind或类似的工具。
答案 2 :(得分:3)
这是由请求分页引起的。该进程具有数组的地址空间(即:存在可用的分页表条目),但尚未附加内存(尚未)。循环分配给(最终)所有属于array []的内存页面,因此在循环结束时所有页面都被“故障”。
作为概念证明,您可以用以下代码替换循环:
for (; i < 1000000; i++){
arr[i] = "hello, world!";
}
结果可能(几乎)与片段#2相同