【问题标题】:Regarding releasing memory allocation in C关于在 C 中释放内存分配
【发布时间】:2011-03-24 05:19:50
【问题描述】:

我有一个关于内存分配 C 的多项选择题,但我确定哪一个是正确答案。

  1. 下列关于释放内存分配的说法错误的是?

    一个。在内存释放后取消引用指向已分配内存的指针是错误的。

    b. free 内存指向的指针不是已分配数组的第一个元素,这是一个错误。

    c。内存不再需要时应立即释放。

    d。只需调用一次free 即可释放分配给calloc 的整个数组。

    e。为了确保它被释放,分配的内存应该在程序结束之前被释放。

它们在我看来都不错:(!有什么想法吗?

谢谢

【问题讨论】:

  • 如果您的问题是关于 C 的,通常与 C++ 无关——尤其是在这种情况下,它询问的是 callocfree,而不是 newdelete
  • 你认为程序结束时分配的内存会发生什么?

标签: c memory-management


【解决方案1】:

正如其他答案所给出的,e 是答案。然而,有趣的选项是 c,这是非常主观的。没有必要尽快释放内存,在某些情况下延迟释放内存是有利的。

例如,如果您知道某个内存块在被释放后肯定会很快被重新分配,那么简单地将其保留在指针中而不是释放它可能会花费更少。希望在每种情况下都清楚拥有这样一个保留的指针是否有意义并适合代码的架构(代码味道!)。有时,较小的性能损失会胜过可读性较差的代码 - 如果不确定,请使用您的判断和衡量!

【讨论】:

  • 感谢您的回答和解释为什么 c 不是。
【解决方案2】:

答案是 e。当一个进程结束时,操作系统会释放它当前持有的所有资源,包括分配的内存。

因此在结束程序之前不需要释放内存。

【讨论】:

    【解决方案3】:

    我认为选项 (e) 是错误的。因为当程序结束时,无论您是否手动执行,操作系统都会释放所有分配的内存。操作系统本身可以确保这一点。无需手动释放来保证!

    【讨论】:

      【解决方案4】:

      一个。是的:这只是一个悬空指针的情况。

      b. True:传递给free()的指针必须指向数组的头地址。

      c。主观的,并不总是正确的,但也不总是错误的。

      d。正确:多次释放会导致未定义的行为。您的程序可能会崩溃,或者它可能会发动核攻击。

      e。错误:由malloc() 分配的内存和来自其家族的函数,在通过free() 解除分配之前一直保持提交状态。通常,仅使用标准库函数,运行中的 C 程序无法知道分配的内存块何时被孤立。但是,操作系统会在进程终止时回收所有此类内存。

      【讨论】:

        【解决方案5】:

        我认为 (e) 在这里是一个正确的答案,其他所有人都对此是正确的,就他们而言,但我认为 (c) 也是一个正确的答案。

        首先,在某些系统(可能是嵌入式系统)上,可能无法保证操作系统会释放所有内存。诚然,如今这并不常见,但 C 编程似乎也是如此!

        但更重要的是,如果你承认操作系统无论如何都会释放你所有的内存(e),为什么“应该”在不再需要内存时立即释放它?除非您更早需要内存,否则这不只是额外的代码,它需要时间来运行并且本身可能有错误吗? (如果我发现每个释放错误都有一美元......)如果它只有 2 个字节,并且释放它需要的代码比你释放的内存要多?

        在编写了许多程序(以及更多错误)之后,我认为应该在方便并且可以稳健地释放内存,除非有充分的理由(并且“我有很多分配的内存”可能是一个很好的理由!)。毕竟,这就是让操作系统在程序退出时释放页面的意义所在。这也是 GC 的重点:对象的生命周期很难。

        “一旦不再需要”适用于 1970 年代的计算机和标准化教科书。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-02-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-19
          • 1970-01-01
          相关资源
          最近更新 更多