描述
指针被释放后,是不是就变成了空指针?这是很多刚接触指针的同学存在的误区。
我们还是写个代码看下:
char *p = (char *)malloc(sizeof(char) * 128);
定义一个指针,然后在堆空间申请一块内存,这种赋值方式就表示指针指向堆空间,画出来就是这样的。
内存用完之后,还得养成释放的习惯,如果不释放,那这块内存一直被占有,其他人就用不了,这就是所谓的内存泄漏。
释放内存使用函数free,参数就是这块内存的地址。
free(p);
在图上的表现就是,这块内存自由了,如果后面有其他地方要使用内存,那操作系统完全可以把这块内存再分配出去。
此时,指针p没有任何的变化,它里面还是保存刚才的地址0x100,只是0x100这块内存已经被释放了,p并不是空指针,我们可以把它称作悬空指针,那悬空指针能不能访问?
char *p = (char *)malloc(sizeof(char) * 128);
free(p);
strcpy(p, "helloworld");
如果你强行去访问的话,就会出现一些未知的问题。
我们在学习的时候,写的代码通常比较少,内存使用的也不多,所以大部分情况下你去访问已经释放的内存好像也没什么问题,其实这是一个误区。
如果把它放到项目中,代码量比较大,内存使用比较多,就会导致一系列意想不到的问题。
所以正确的做法应该是,内存释放后,再加上一条语句:
p = NULL;
把p变成空指针。
虽然空指针也不能通过 * 去访问,但是空指针是可控的,有的时候加上一些判断,就能有效的防止一些意外的发生。
审核编辑:刘清
打开APP阅读更多精彩内容