在malloc()分配后释放的内存会发生什么?

时间:2016-04-22 15:03:13

标签: c memory memory-management free

释放后使用malloc()分配的内存会发生什么? 假设我做了以下......

int main(){
    int * arr;
    arr=(int*) malloc(sizeof(int)*20);
    int i;
    for(i=0;i<20;i++) arr[i]=2*i+1;
    int * tmp=arr;
    for(i=0;i<20;i++) printf("%d ",*(tmp+i));
    printf("\n");
    free(arr);
    for(i=0;i<20;i++) printf("%d ",*(tmp+i));
    return 0;
}

我得到了输出......

1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 
0 0 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 

为什么前两个条目会改变(其他条目不会改变)?

2 个答案:

答案 0 :(得分:2)

  

为什么前两个条目会改变(其他条目不会改变?)

TL; DR undefined behavior

free()之前返回的指针上调用malloc()后,该指针在程序上下文中不再有效。尝试使用它会调用undefined behavior

即将到来实际内存会发生什么,这也是依赖于环境的。调用free()只是告知下层(操作系统/内存管理器)可以回收并重用内存 (如果需要 )的方法。 强制没有必要清理(归零)或类似内存位置。

答案 1 :(得分:0)

mallocfreerealloc函数管理传统上称为&#34;堆&#34;的内存区域。 mallocrealloc选择堆的一个区域,将其标记为&#34;在使用&#34;中,并向您返回指向内存的指针。 free会将内存返回给堆,供将来的mallocfree来电使用。

free将内存返回到堆中,并将其标记为程序不再使用时,可能是它标记的方式之一涉及在内存中设置位。在您的情况下,这就是为什么您的某些数组值发生了变化。

(但当然,你不能依赖于此。其他实现可能会使现在释放的内存完全保持不变。其他人可能已完全删除它。而且你的程序也可以在释放后尝试打印内存时崩溃了,因为你当然不应该这样做。)