【问题标题】:C automatic variablesC 自动变量
【发布时间】:2014-08-04 14:47:17
【问题描述】:

如果我们使用 free() 释放自动变量会发生什么?

在下面的代码中怎么样:如果 nstatic 在最后一次循环迭代后它会自动释放,我们可以 free 它吗?

for(count = 0; count < 5; count++) {  
    static int i += 1
}

【问题讨论】:

  • 好的,那么静态变量呢?
  • 也许这是这个问题的重复:stackoverflow.com/questions/2337972/…
  • @user3121023:为什么要猜?该标准说它存在于程序的整个执行过程中。您可以合法地获取它的地址并在循环甚至包含函数终止后使用它;只有名称 i 是循环的本地名称。
  • 你的代码片段没有n

标签: c static


【解决方案1】:

如果我们使用free() 释放一个自动变量会发生什么?

它将调用未定义的行为

free 的参数必须是内存分配函数返回的指针malloccallocrealloc)。参数也可以是空指针,此时free的调用无效。

【讨论】:

  • 释放空指针也是合法的,即使它不是由分配函数返回的。 (C11 7.22.3.3:2)
  • @PascalCuoq;是的,没错。补充说。
【解决方案2】:

如果您 free() 自动变量,则结果未定义。

static 变量由运行时清理。不需要free他们。

free 仅用于您使用malloc/calloc 分配的指针

【讨论】:

    【解决方案3】:

    free唯一 有效参数是先前调用 *alloc 函数之一(malloccallocrealloc)或 @987654326 的结果@。就是这样。

    auto 变量在其封闭范围的生命周期内存在;尝试在其中调用free 将调用未定义的行为(这可能导致访问冲突或段错误)。

    static 变量存在于程序的整个生命周期中,即使它们的可见性仅限于特定范围; i for 循环中的 i 在程序启动时分配并保持到程序终止,但只能在 for 循环的范围内访问。与 auto 变量一样,尝试在静态变量上调用 free 将调用未定义的行为,并且可能会导致运行时错误。

    【讨论】:

      【解决方案4】:

      free() 的单个参数是一个指针,传递一个非指针不会编译,所以这个问题没有实际意义。

      传递一个以前没有从 堆分配函数 返回并且以前没有传递给free()指针 的效果是未定义的 - 但从来没有用处或正确,而且通常是致命的。

      实际上,free() 将假定指针是从堆中分配的块;实现可能会检测到错误,也可能会破坏堆。该错误可能不会被检测到,并且会在以后的一些堆操作中导致本质上未定义的故障,从而很难确定最初的原因。

      在典型的实现中,分配的块之前是堆元数据; free() 通过从传递给它的指针中减去元数据的大小来访问此数据。对于非堆分配的指针,读取的数据将是无效的废话。实现可能能够验证这些数据并导致运行时错误,但在简单的实现中,元数据可能只包含块的大小,并且可能会将未定义大小和不适当位置的块添加到堆中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-18
        • 2011-06-02
        • 2017-12-02
        • 2014-05-12
        • 1970-01-01
        相关资源
        最近更新 更多