指针释放后是否需要为空?

时间:2020-02-17 08:21:20

标签: c

int main(){

(int*) pointer = (int*) malloc(sizeof(int));
free(pointer);

}

我从斯蒂芬·普拉塔中学到了。 C Primer Plus(开发人员库)” “当函数终止时,作为自动变量的指针消失。” 很简单,我不需要将指针归零

但是,我还从学校获悉,如果指针在释放后没有变为空,则该指针将变为悬空指针。

两个想法相互矛盾。哪个是正确的?

2 个答案:

答案 0 :(得分:3)

根据docs

当指针指向的对象(或刚刚过去的对象)达到其生命周期的尽头时,指针的值将变得不确定。

因此,如果紧接在作用域之后的指针nullptr(在C ++ 11中)或NULL(在C ++和C ++ 11之前)中,则无需设置指针free之所以使用它,是因为这样您就没有机会取消引用悬空的指针了。

但是,如果指针在调用free之后仍然在作用域中,那么好的做法是将其设置为nullptrNULL,以便进行以下检查工作:

C ++:

if (nullptr != ptr) {...}

C:

if (NULL != ptr) {...}

C和C ++:

if (!ptr) {...}

答案 1 :(得分:0)

free执行的操作是在free执行之前释放指针所持有的空间。指针在执行之前和之后均持有一个整数值(地址),因此,该指针所持有的地址现在是程序未分配的无效地址。如前所述,如果您打算在将来的情况下再次使用该指针,则您将不需要具有无法检查的无效未定义值,而将其设置为null将使检查更加容易。