在C中释放内存的需求是什么?

时间:2014-06-15 10:44:54

标签: c memory operating-system

我可能会被误导,但据我所知,操作系统会在程序退出或崩溃后清理内存。

如果是这样,在程序结束时释放内存有多大用处?我知道如果一个程序正在运行并且忽略了解除分配,那么内存可能会变得“满”,但如果一个程序已经结束并且操作系统解除了程序使用的所有内存,那么手动解除分配该内存的意义何在?

6 个答案:

答案 0 :(得分:4)

清洁度。

当然,你可以不费心去清理并让系统处理它。但是,如果执行此操作,则基本上不可能跟踪程序中的内存泄漏,因为您无法运行它并查看是否在末尾分配了任何内容。另一方面,如果确保干净关闭,则可以通过运行它来查看是否存在任何泄漏,并查看是否在末尾分配了任何内容。因为任何可能在一段时间内运行的非平凡程序都需要避免内存泄漏,所以以这种干净的方式进行操作会带来好处。

此外,它还只是确保您的程序在任何持久状态下保持正常关闭以及释放的任何外部资源(尽管大多数现代操作系统最近都会清理它们)的一部分,因为您&#39重新进行有序关闭,而不仅仅是切割和运行。

答案 1 :(得分:4)

引自Memory Deallocation Issues in C

  

操作系统负责维护应用程序的资源,包括其内存。当应用程序终止时,操作系统有责任为其他应用程序重新分配此内存。已终止应用程序的内存状态(已损坏或未损坏)不是问题。实际上,应用程序可能终止的原因之一是它的内存已损坏。如果程序异常终止,则可能无法进行清理。

     

有了这个说法,当程序正常终止时,可能还有其他原因要释放内存:

     
      
  • 尽职尽责的程序员可能希望将内存释放为质量问题。即使应用程序正在终止,在不再需要内存后释放内存也是一个好习惯。
  •   
  • 如果使用工具检测内存泄漏或类似问题,则解除分配内存将清除此类工具的输出。
  •   
  • 在一些不太复杂的操作系统中,操作系统可能无法自动回收内存,程序可能需要在终止之前回收内存。
  •   
  • 此外,应用程序的更高版本可以在程序结束时添加代码。如果尚未释放先前的内存,则可能会出现问题。
  •   

答案 2 :(得分:1)

不同的观点:

在程序的 end 中,通常没有特定的实际理由来清理内存。但并不是你通常设计不适合单个页面的非平凡程序!程序的各个部分通常需要设计为无论何时在程序执行过程中运行,并且通常不了解程序的其余部分。他们无法永久地分配和占用内存,因为一般来说,他们不知道他们被调用的频率,或者他们将遵循多少代码,或者知道多长时间。毕竟,许多最终用户应用程序旨在运行一个潜在无限的主循环#34。

因此,一个完全清理的程序本身并不是一个目标,它是从头开始正确设计整个程序的较小后果之一(对于痴迷的奖励!)。它也可以作为警告标志,如果最后遗留资源,设计过程的某些阶段没有计划。

答案 3 :(得分:0)

你不能总是依赖系统,尽管大多数现代人都这样做。 AFAIK Windows 95没有这样做,所以也许一些狂野的嵌入式系统也不会在进程后清理。

除此之外,这是一个好习惯。有时您会将main中的内容重构为某些模块并尝试重用它们。不要忘记解除分配的事情。

答案 4 :(得分:0)

是的。那是对的。如果某个对象在应用程序的整个持续时间内都存在,那么在启动时分配它一次并且永远不会释放/删除该对象是合理的。但是,如果将某些内容作为计算的一部分进行分配,而不需要在程序的整个生命周期内保留该对象,则在不再需要该对象时释放该对象非常重要;否则,由于对象在程序的生命周期内泄露,程序将慢慢耗尽可用内存。

应该注意的是,即使你释放了你的记忆,在你有机会释放记忆之前,你的程序总是有可能被强行终止(例如通过信号)。所以,这是不是超级偏执的一个原因。话虽如此,为了保持一致性并保持常规分配/解除分配以及长寿命对象的分配/解除分配的良好习惯,我通常更喜欢释放/清理长寿命对象,就像常规对象一样。话虽这么说,你应该平衡清洁和快速关闭的愿望以及在强制关闭的情况下生成适当的核心转储/日志的能力。例如,花时间释放大型长寿命数据结构可能会花费时间编写核心转储,在这种情况下,编写核心可能会更好。

答案 5 :(得分:0)

通常,如果在不再需要时不释放内存,则可能耗尽系统的内存资源。这就是所谓的内存泄漏。

这在运行很长一段时间的程序中最为明显......当它们运行并分配越来越多的内存(例如,调用malloc)时,程序会消耗越来越多的内存资源。如果它们没有返回到系统,则操作系统可以开始耗尽内存,以便在“malloc”时为其应用程序提供服务。被称为。

某些操作系统和编程语言具有可以缓解或防止这种情况发生的功能。

例如,Java不允许您直接调用malloc和free。相反,在创建对象时,java运行时会为它们分配内存。当你完成变量时(即当它们进入"超出范围")时,它们被标记为"垃圾收集"。通常,"垃圾收集"任务或函数将定期运行,并将在与不再使用的变量相关的所有内存上调用free(即"清除垃圾")。

某些操作系统还支持对进程和/或线程的运行时限制,以防止它们消耗所有"所有"系统资源。如果达到任何这些限制,操作系统可以暂停程序的执行。

希望有所帮助, - J.