2011-11-12 94 views
2

我有一个关于我的代码的简短问题。我已经创建了两种情况或用于测试的示例。C内存免费混淆

例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时,它不释放所有内存。 我已经搜查,但看不出来。

为什么是实施例2不同,则实施例1的结果?

我的常识告诉我,例如1和2应该导致同样的,但在实践中并非如此。我使用linux top来检查内存使用情况。

+6

你怎么知道它不释放所有内存? – EricSchaefer

+0

你是如何推断第二个例子没有释放所有内存的? – Joe

+0

你检查了什么?过程的RSS? – wildplasser

回答

3

它是由需求造成的分页。该进程具有数组的地址空间(即:存在可分页条目),但没有附加内存(尚)。循环指定(最终)属于数组[]的所有内存页面,因此在循环结束时,所有页面都已“故障”。

由于概念证明,可以用替换循环:

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

而结果可能会是(几乎)相同片段#2

4

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

+0

我的内存使用情况显示不同的值 –

+0

@Tim如何检查内存使用情况? –

+0

@etienne:linux top –

3

两者都是一样的。

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

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