C - free() 没有释放整个数组
C - free() is not freeing the entire array
我有一个指向 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;
}
输出:(抱歉将所有输出放在一行中)
12 15 100 101 102 103 109 999
完成释放。
0 0 100 101 102 103 109 999
当您调用 free
时,您只是告诉 OS 您已完成该内存块。你保证不再使用它。如果你违背诺言,那是你的问题。
重要旁注:
调用 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 具有什么价值?最好了解指针 is/isn't NULL.
的实际含义
我有一个指向 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;
}
输出:(抱歉将所有输出放在一行中)
12 15 100 101 102 103 109 999 完成释放。 0 0 100 101 102 103 109 999
当您调用 free
时,您只是告诉 OS 您已完成该内存块。你保证不再使用它。如果你违背诺言,那是你的问题。
重要旁注:
调用 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 具有什么价值?最好了解指针 is/isn't NULL.
的实际含义