关于在C中释放内存分配

时间:2011-03-24 05:19:51

标签: c memory-management

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

  1. 以下哪些关于释放内存分配的说明是错误的?

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

    free内存错误,指针指向分配数组的第一个元素以外的其他内容。

    ℃。记忆应该在不再需要时立即释放。

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

    即为确保释放它,应在程序结束前释放已分配的内存。

  2. 他们看起来都对我:(有任何想法吗?

    由于

5 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:5)

正如其他答案所给出的, e 就是答案。然而,有趣的选择是 c ,这是非常主观的。没有任何理由尽快释放记忆,在某些情况下延迟记忆是有利的。

例如,如果您知道某个内存块在释放后肯定会很快重新分配,那么将它保留在指针中可能会花费更少,而不是释放它。在每种情况下都希望能够清楚地知道这样的保留指针是否有意义且适合代码的体系结构(代码味道!)。有时候,轻微的性能损失会因代码不太可读而失败 - 如果不确定,请使用您的判断和衡量标准!

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

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

℃。主观但并非总是如此,但也不总是错误。

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

即错误:malloc()分配的内存及其来自其系列的函数将一直提交,直到通过free()取消分配。通常,仅使用标准库函数,正在运行的C程序无法知道分配的内存块何时被孤立。但是,操作系统将在进程终止时回收所有此类内存。

答案 4 :(得分:0)

我认为(e)在这里是正确的答案,其他人对此都是正确的,只要他们去,但我认为(c)也是正确答案。

首先,在某些系统(可能是嵌入式系统)上,可能无法保证操作系统将释放所有内存。不可否认,这些日子不是常见的情况,但是,C编程也是如此,似乎!

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

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

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