问题描述
- C语言中malloc和free的问题
-
int *intPointer = (int *)malloc(3 * sizeof(int)); intPointer[0] = 1; intPointer[1] = 2; intPointer[2] = 3; printf("before free :%ld ",intPointer); free(intPointer); printf("after free :%ld ",intPointer); printf("%d %d %d ",intPointer[0],intPointer[1],intPointer[2]);
输出结果:
before free :4296037472
after free :4296037472
1 2 3疑问:free(intPointer)之后,为什么还能通过intPointer访问malloc分配的那片内存?
解决方案
举个例子来说,如果有个人经常问你借一样东西:
对这个东西的处理方法有两种:
(1)他不停地借、还,耗时,效率低。
(2)让他借一次,等他的确不用的时候再还,但是在他没还之前,别人就不能用了。
malloc就是借内存,free就像是还内存
操作系统为了提高效率,就采用了第(2)处理办法,反正操作系统可以搞到很多内存。
free可以理解为“假还”,东西还在你那里,但是你不应该继续使用了,应该去借。
对于部分操作系统,free之后是把intPointer[0].....的值给删除了、部分不是。
另外提一句:
free之后要,intPointer = NULL;
理解万岁!!!
解决方案二:
写程序时用malloc竟然出现段错误,而且明显那块没有用错,肯定是别的地方有内存泄漏的问题,导致最后内存泄漏了。需要好好查一查原因了。但程序中很多地方都用来malloc,内存全是随便用的,要改起来估计十分麻烦。。。。
????
??下面找了点malloc与free的介绍,先看......
答案就在这里:C语言中malloc与free
----------------------
解决方案三:
free当然可以在此分配了,如果不分配,访问会出错
解决方案四:
free后,指针不可用,但是再次分配了,如果不分配,访问会出错
解决方案五:
free函数只是释放了你对那片空间的使用权。调用free函数之后其它程序就可以访问这段内存空间了。
解决方案六:
before free :5592120
after free :5592120
-17891602 -17891602 -17891602
这是我用你的代码的输出结果,所以应该不存在你说的那个问题
#include
#include
int main(void)
{
int *intPointer = (int *)malloc(3 * sizeof(int));
intPointer[0] = 1;
intPointer[1] = 2;
intPointer[2] = 3;
printf("before free :%ld
", intPointer);
free(intPointer);
printf("after free :%ld
", intPointer);
printf("%d %d %d
", intPointer[0], intPointer[1], intPointer[2]);
system("pause");
}
解决方案七:
free只是通知内存分配器释放这部分内存空间,但是还是有可能恰巧还能让你访问到,但这种行为是未知的,可能引起各种错误
解决方案八:
free(intPointer)只是告诉操作系统这段内存可以被申请了,这段内存内容并未因此消失,黑客可以利用这个进行内存攻击,安全要求较高的代码需要重新对这段内存清空,一般就是写零值
解决方案九:
free(intPointer)只是告诉操作系统这段内存可以被申请了,这段内存内容并未因此消失,黑客可以利用这个进行内存攻击,安全要求较高的代码需要重新对这段内存清空,一般就是写零值
解决方案十:
忘了说,指针就是一个内存索引值,通过这个值可以访问指定位置的内存内容,所以你会获取到相同的内容,如果把指针值重置,则结果是未知的