<span style="font-size:14px;">// 本程序是为了测试 一个malloc的指针,在赋给另一个指针前,free掉的话,对另一个指针的影响
// 测试结果:貌似没有影响,但是我不知道对错。
#include <stdlib.h>
#include <stdio.h>
#include <memory.h>
int main(int agrc, char **argv)
{
int n, *array, *temp, i;
n = atoi(argv[1]);
array = malloc(n * sizeof(int));
for (i = 0; i < n; i++)
{
array[i] = i;
printf("%d\t", array[i]);
}
printf("\n");
free(array);/////////////////////////
temp = array;////////////////////////
// free(array);将free放在下面的话,程序运行也没有影响
for (i = 0; i < n; i++)
{
printf("%d\t", temp[i]);
}
printf("\n");
return 0;
}
</span>
free(array); 应该是在temp = array之前还是之后呢?
你这段代码,之前之后没有两样,因为你要在 free(array); 之后,使用这个,指向被释放的内存的,指针 tmp;
当指针 array的内存释放后,无论释放之前还是之后,执行 temp = array ,tmp 都和array 一样成了野指针。
要想避免这种情况,就是在释放之前,赋值并读写tmp这块内存,释放后,不要再使用 tmp,和array 指向的内存。当然array和tmp都设置为NULL,最好!!!
当你的程序,满天飞的都是这种代码时,出错就是必然的了。
这种很少的代码,是测试不了这种错误的。
你不断的malloc ,free,并且占用内存很大的时候,错误就会出现了。
当某一时刻,你这这个tmp正好指向了内存管理的单元,比如恰好表记这块内存大小的位置,你的tmp 指针恰好改写了这个数据,后面分配内存的机制就会出错了,你的程序就崩溃。
再比如,你有一个循环,恰好使用新分配的内存里的某个数据作为条件,初值,以及循环变量等等,你的tmp恰好指向这个单元,你用tmp这个指针改写这个数据,那么这个循环,无论如何都不会正确运行了。
PS : 结论
任何动态分配的内存,一旦释放;
1)所有指向这块内存的指针,都要立刻停止对所指内存的读写操作,不光是分配的那个指针。
2)更不能内存释放后,把这个野指针赋值给别的指针。
3)这个只是建议:
为了保险起见,内存释放后,持有它的指针要赋值为NULL。
其他指向释放的那块内存的指针,最好也做同样处理。
可以参见