我有一个指向 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 %dn", 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 %dn", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
return 0;
}
输出:(抱歉将所有输出放在一行中(
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);
你期望p2有什么价值?最好了解指针为 NULL 的实际含义。