一、问题
从字⾯上理解,free() 是释放,给予⾃由的意思;⽽ delete() 的含义⽐较直接,是删除的意思。这两个函数的⽬的就是不想再与这个指针有任何关联,那么它们到底怎样处理了不再使⽤的指针呢?
二、解答
其实 free() 函数和 delete() 函数起到的作⽤只是将该指针所指的内存释放掉,但并没有把指针本⾝彻底消除。
观察如下程序,通过调试器跟踪查看,指针的地址的变化。注意 free() 释放该指针后, 地址是否为 NULL。相应代码如下。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char *p = (char *)malloc(100);
strcpy(p, "helloworld");
free(p);
if (p != NULL)
{
stpcpy(p, "world");
}
}
当程序运⾏完语句“strepy(p,"helloworld");”后,可以观察到调试器中的 p 指针的地址和存储的内容,结果如图所示。
当执⾏完 free(p) 后,即释放指针p结束,p 的地址是否指向 NULL呢?观察下图所示的跟踪调试。
通过跟踪调试的两张图可以发现,指针,被 free 释放以后,其地址仍然不变,并不是 NULL。此时,指针 p 就成为了“野指针”,如果不把 p 置 NULL,会让⼈误以为 p 是⼀个合法的指针,⽽继续使⽤。通常,在继续使⽤之前,会通过语句计 (p!=NULL)进⾏防错处理,但是在此程序中这条语句并没有起到防错作⽤,因为此时的p并没有指向合法的内存块。
三、总结
为了不让指针 p 成为“野指针”,⽽造成不必要的⿇烦,在 free() 释放掉指针后,要将指针 p 设置为 NULL。