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

C 指针释放后是否需要为空?,c,C,我是从普拉塔那里学到的,斯蒂芬。C Primer Plus开发人员库中的 当函数终止时,作为自动变量的指针将消失。简单地说,我不需要将指针设为null 然而,我也从学校学到,如果指针在释放后没有被置空,它就会变成一个悬空的指针 这两种观点相互矛盾。哪个是正确的?根据: 当指针指向或刚刚经过的对象到达其生命周期结束时,指针的值将变得不确定 因此,如果在释放指针后它立即超出范围,则不需要在C++11中设置指向nullptr的指针,或者在C++11之前设置指向nullptr的指针,因为这样就没有机会取

我是从普拉塔那里学到的,斯蒂芬。C Primer Plus开发人员库中的 当函数终止时,作为自动变量的指针将消失。简单地说,我不需要将指针设为null

然而,我也从学校学到,如果指针在释放后没有被置空,它就会变成一个悬空的指针

这两种观点相互矛盾。哪个是正确的?

根据:

当指针指向或刚刚经过的对象到达其生命周期结束时,指针的值将变得不确定

因此,如果在释放指针后它立即超出范围,则不需要在C++11中设置指向nullptr的指针,或者在C++11之前设置指向nullptr的指针,因为这样就没有机会取消对悬空指针的引用

但是,如果调用free后指针仍在作用域中,那么最好将其设置为NULL ptr或NULL,以便进行以下检查:

C++:

如果为空ptr!=ptr{…} C:

如果为空!=ptr{…} C和C++:

如果ptr{…} 根据报告:

当指针指向或刚刚经过的对象到达其生命周期结束时,指针的值将变得不确定

因此,如果在释放指针后它立即超出范围,则不需要在C++11中设置指向nullptr的指针,或者在C++11之前设置指向nullptr的指针,因为这样就没有机会取消对悬空指针的引用

但是,如果调用free后指针仍在作用域中,那么最好将其设置为NULL ptr或NULL,以便进行以下检查:

C++:

如果为空ptr!=ptr{…} C:

如果为空!=ptr{…} C和C++:

如果ptr{…}
free所做的是在执行free之前释放指针持有的空间。指针在执行之前和之后都持有一个整数值地址,因此指针持有的地址现在是一个无效地址,程序没有分配该地址。如前所述,如果您计划在将来的情况下再次使用指针,您不会希望指针中包含无法检查的无效未定义值,使用null会使检查更容易。

free所做的是在执行free之前释放指针所保留的空间。指针在执行之前和之后都持有一个整数值地址,因此指针持有的地址现在是一个无效地址,程序没有分配该地址。如前所述,如果您计划在将来的情况下再次使用指针,您不希望在其中包含一个无法检查的无效未定义值,使用null会使检查更容易。

指针是一个悬空指针,但这有什么关系?不管怎么说,它都超出了范围。悬空指针不是问题,只要你不使用它们。您可以在变量中有一个悬空指针,然后重用该变量指向其他地方。据我所知,将其设置为null是一种安全门,这样以后您仍然可以使用它进行比较,而不会出现内存错误,如果指针==null,则需要释放指针,。这是更好的方法,实际上至少有十几个类似的方法。指针是一个悬空的指针,但它又有什么关系呢?不管怎么说,它都超出了范围。悬空指针不是问题,只要你不使用它们。您可以在变量中有一个悬空指针,然后重用该变量指向其他地方。据我所知,将其设置为null是一种安全门,这样以后您仍然可以使用它进行比较,而不会出现内存错误,如果指针==null,则需要释放指针,。这是一种更好的方法,实际上至少还有十几种类似的方法。我喜欢指针类型到bool的隐式转换:`ifptr{…},或者,如果你想检查初始化它的必要性,如果!ptr{/*init ptr*/}`。我意识到这是C++;我肯定它在主要的C环境下工作,但不确定它的标准。@Peter说得很好。我要补充的是,tooThat文档是不正确的。自由后指针变量的值变得不确定。来源:C标准。@AnttiHaapala你说的不确定是什么意思?这不是意味着指向同一个现在无效的位置的不确定点吗?你能把你的C标准源发给我,这样我就可以更新我的答案了吗?@nuttracker我喜欢指针类型到bool的隐式转换:`ifptr{…},或者,如果你想检查是否需要初始化它,如果!ptr{/*init ptr*/}`。我意识到这是C++;我肯定它在主要的C环境下工作,但不确定它的标准。@Peter说得很好。我要补充的是,tooThat文档是不正确的。自由后指针变量的值变得不确定。来源:C标准。@AnttiHaapala你说的不确定是什么意思?这不是意味着指向同一个现在无效的位置的不确定点吗?请把你们的货源寄给我好吗 这样我就可以更新我的答案了?@胡桃夹子
int main(){

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

}