【问题标题】:Does a pointer need to be nulled after it is freed? [duplicate]指针释放后是否需要清空? [复制]
【发布时间】:2020-06-01 03:28:25
【问题描述】:
int main(){

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

}

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

不过,我也从学校了解到,如果指针在释放后不为空,则指针会变成悬空指针。

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

【问题讨论】:

  • pointer 是一个悬空指针,但它有什么关系呢?无论如何它都会超出范围。
  • 悬空指针不是问题,只要你不使用它们。你可以在变量中有一个悬空指针,然后重用该变量指向其他地方。
  • 据我所知,将其设置为 null 是一种“安全”门,因此以后您仍然可以使用它进行比较而不会出现内存错误 if (pointer == null)
  • 你需要释放指针,。这是更好的方法
  • Should one really set pointers to NULL after freeing them?,实际上至少还有十几个类似的行。

标签: c


【解决方案1】:

根据docs

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

因此,如果在 free 之后立即超出范围,则不需要设置指向 nullptr(在 C++11 中)或 NULL(在 C 和 C++11 之前)的指针是因为这样你就没有机会取消对悬空指针的引用。

但是,如果在调用 free 后指针仍在作用域内,则最好将其设置为 nullptrNULL,以便进行以下检查:

C++:

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

C:

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

C 和 C++:

if (!ptr) {...}

【讨论】:

  • 我喜欢将指针类型隐式转换为 bool:` if(ptr) {...}, or, if you want to check the need to initialize it, if(!ptr) { /* init ptr */ }`。 (我意识到这是 C++;我确信它适用于主要的 C 环境,但不确定标准。)
  • @Peter-ReinstateMonica 好点。我也会补充的
  • 那个“文档”不正确。 free 之后的指针变量的值变为indeterminate。来源:C 标准。
  • @AnttiHaapala 不确定是什么意思?这是否意味着不确定的指向相同(现在无效)的位置?您能否将您的 C 标准来源发送给我,以便我更新答案?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-06-19
    • 2020-12-06
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 2011-10-12
    相关资源
    最近更新 更多