我有一个指向 int 的指针,在我调用 free 之后,我看到只有前两个元素被释放,其余的保持不变。有人可以解释一下吗?
int main() {
int* a = (int*)malloc(10*sizeof(int));
a[0] = 12;
a[1] = 15;
a[2] = 100;
a[3] = 101;
a[4] = 102;
a[5] = 103;
a[6] = 109;
a[7] = 999;
printf("%d %d %d %d %d %d %d %d\n", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
free(a);
printf("Done freeing.\n");
printf("%d %d %d %d %d %d %d %d\n", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:(抱歉将所有输出放在一行中)
12 15 100 101 102 103 109 999 释放完毕。0 0 100 101 102 103 109 999
当您调用 时free,您只是告诉操作系统您已完成该内存块的使用。你保证不再使用它。如果你违背了那个承诺,那就是你的问题。
重要的旁注:
调用if(ptr)或if(NULL != ptr)不测试是否ptr指向分配的内存块。它只测试它是否指向任何东西。调用free不会将 null 分配给任何指针。你必须手动处理。我以艰难的方式吸取了这一教训......
重要的旁注 2:
没有通用的方法来确定内存ptr指向是否已分配。一些平台提供此功能,但不是全部。
现在,也许您想知道,如果free(ptr)将 NULL 分配给 ptr不是更好吗?也许,也许不是。缺点是它是虚假的安全。考虑这个代码:
int *p1=malloc(sizeof *p1);
int *p2=p1;
free(p1);
Run Code Online (Sandbox Code Playgroud)
您期望 p2 具有什么值?最好了解指针是/不是 NULL 的实际含义。