2011-03-24 117 views
1

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

  1. 以下有关释放内存分配的说明中哪项是错误的?

    a。内存释放后将指针解除引用分配的内存是错误的。

    b。对指向除分配数组的第一个元素以外的指针的free存储器是错误的。

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

    d。只需要拨打free的一个电话即可释放分配给calloc的整个阵列。

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

他们都看我的权利:(!你知道吗?

感谢

+1

如果你的问题是关于C的,通常不是关于C++的 - 特别是在这种情况下,它询问'calloc'和'free',而不是'new'和'delete'。 – Cascabel 2011-03-24 05:24:26

+0

当程序结束时,您认为程序的分配内存会发生什么? – 2011-03-24 05:25:44

回答

5

正如其他答案给出的,e就是答案。然而有趣的选择是c这是非常主观的。不一定有任何理由尽快释放记忆,在某些情况下延迟记忆是有利的。例如,如果您知道某个内存块在释放后很快就会被重新分配,那么将其保留在指针中可能会花费更少,而不是将其释放。在每种情况下,希望清楚的是,是否有这样一个保留的指针是合理的,并且符合代码体系结构(代码异味!)。有时候,性能损失较小,可读性较差 - 如果不确定,请使用您的判断和衡量标准!

+0

感谢您的答案,并解释为什么** c **不是。 – Chan 2011-03-24 05:52:13

5

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

因此没有必要以释放内存结束程序之前。

2

我觉得选项(e)是错误的。因为当PROGR我结束了,无论您是否手动执行,所有分配的内存都由操作系统释放。操作系统本身确保。无需通过手动释放来确保它!

0

我认为(e)在这里是一个正确的答案,并且其他人都是正确的,只要他们去,但我认为(c)也是正确的答案。首先,在某些系统上(也许是嵌入式系统),可能无法保证操作系统将释放所有内存。这些日子当然不是一个普通的例子,但是,看起来C编程也是如此!

但更重要的是,如果承认,操作系统将会释放了所有你的记忆集体反正(五),为什么“应该”存储器只要它不再需要释放?除非您之前需要内存,否则这不仅仅是额外的代码,这需要时间来运行并且可能会有错误? (如果我发现每个释放错误都有一美元...)如果只有2个字节,如果释放内存需要更多代码才能释放内存?我认为应该在便利的上发布内存,并且可以强健地完成,除非有很好的理由(“我有大量的内存分配”可以是一个很好的理由!)。毕竟,当程序退出时,这就是操作系统释放你的页面的要点。这也是GC的重点:对象的生命周期很艰难。

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

2

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

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

c。主观的并不总是如此,但也不总是错误的。

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

e。错误:由malloc()分配的内存以及其家族的功能将保留,直到通过free()取消分配为止。通常,仅使用标准库函数,正在运行的C程序无法知道分配的内存块何时被孤立。但是,当进程终止时,操作系统将回收所有这些内存。