求助 一个指针被free之后啥时候是NULL?还是不可能是NULL?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求助 一个指针被free之后啥时候是NULL?还是不可能是NULL?相关的知识,希望对你有一定的参考价值。
求助 一个指针被free之后什么时候是NULL?还是不可能是NULL?
例如
int *p;
free(p);
int *p;
free(p);
这段代码如果是连续的,只能在函数内出现,那么int* p;是局部自动变量,不会隐式初始化为0(NULL)。未初始化的变量的值是不确定的(一般运气不会好到就是0;例如Microsoft Visual Debugger会在Debug模式下给未初始化的栈每个字节填充0xcc,根本不可能是0),直接free的后果不可预料。
为了防止错误地free掉已经被释放的指针,建议free某个指针之后立刻把这个指针赋值为NULL。
====
[原创回答团]
参考资料:原创
参考技术A free(p) 并不会对p本身的值做改变。所以p的值不变!可能会改变p指向的那块内存值。这个要看是什么编译器。
然而绝对会改变的就是 p所指向的那块内存的状态,free之前这块内存是属于本进程的,其他进程不可以合法访问,操作系统也不会分配给其他进程或者线程。
free之后那块内存就成为自由内存,可供操作系统分配任意进程。
所以被free之后的内存就不要访问,否则可能会跟其他进程“打架” 参考技术B if (p=NULL)
.........................
试一试就知道了
野指针的学习
1、野指针
野指针是指向了“垃圾”内存的指着。
2、产生原因
(1)指针变量没有被初始化。任何指针变量刚刚被创建的时候,是不会自动变成NULL指针的,他的缺省值是随机的,这个时候指针是乱指的。所以指针变量在被创建的同时应该被初始化,让指针指向合法的内存。
(2)指针P被free或者delect之后,没有设置为NULL;当指着被free之后,其实就是释放了指针指向这块内存进行释放,也就是说指针依旧是指向这个地址,但是这个地址上面的东西不要了,并且系统也不会将这块内存继续保留。后面有可能将这个地址分配给别人,所以free掉之后,有的时候指针还是可以继续操作,但是很有可能系统恰叫将这块内存分配给别人。就会出现程序的崩溃。
(3)指针的操作超越了变量的作用范。
错误示范:
char *p = (char *)malloc(100); strcpy(p, "hello"); printf("p = %s\n", p); free(p); strcpy(p, "world"); printf("p = %s\n", p);
指针 p 被free之后,其实就是将p指向的这块内容进行释放,系统也对这块内存不在保留,以后别人malloc 的时候,就会将这个内存分配给别人。所以free 掉之后,就不要再继续使用指着p,会导致程序的崩溃。
解决办法:
char *p = (char *)malloc(100); strcpy(p, "hello"); printf("p = %s\n", p); free(p); p = NULL; p = (char *)malloc(100); strcpy(p, "world"); printf("p = %s\n", p);
指针p 被释放之后,赋值为NULL;后面的可以通过判断 p != NULL 进行判断。被使用之后的指针,绝对不要在继续使用了,重新使用的话,要重新申请新的内存地址,或者指向新的合法的地址。
以上是关于求助 一个指针被free之后啥时候是NULL?还是不可能是NULL?的主要内容,如果未能解决你的问题,请参考以下文章
结构体指针在使用完free后,该指针所指向的内存区域是啥,这个指针是变成了NULL,还是野指针。
请问C语言free(p)释放p所指向的动态内存后p指向哪?是NULL还是随机还是啥呢?
C语言中, 为了避免野指针,是否可以在free和delete之后,把指针置为NULL就可以避免了?