【问题标题】:Does windows automatically free up memory when program closes (not returning from main)? [duplicate]程序关闭时(不从主程序返回),Windows 是否会自动释放内存? [复制]
【发布时间】:2013-04-14 10:20:42
【问题描述】:

程序关闭时分配的新内存是否总是被释放? (即使因错误/错误等或自定义关闭功能意外关闭)?

还是只有从main返回才释放内存?

【问题讨论】:

标签: c++ memory


【解决方案1】:

是的,操作系统通常会跟踪每个进程分配的内存,并在这些进程终止时释放它——无论如何。

然而,这不是在您的程序中一般存在内存泄漏的正当理由:程序应始终主动释放它获取的资源(包括内存) , 除非有一个非常好的 - 并且记录在案的 - 理由不这样做。

很好的理由可能是程序的正确性依赖于全局/单例对象的销毁顺序,或者在终止之前主动释放分配的内存的代价很高。

然而,尽管承认程序员有意避免释放内存可能是有原因的,但请注意不要形成一种过于肤浅的思维方式,即认为不释放内存是“很好的理由”自己打扫卫生。

我会鼓励你习惯于编写确实释放它所获得的内存的代码,并以非常清晰的形式明确记录你要遵循这种做法的每一种情况。同样,虽然可能存在需要这样做的极端情况,但释放或不释放获得的内存始终必须是程序员的主动、有意决定。


注意: 引用 cmets 中的 Steve Jessop,另一个你不想主动释放内存的好理由是当你的程序需要终止时,因为它以某种方式达到了一个意外的状态 - 也许是一个这违反了不变量或某个函数的先决条件。通常,违反先决条件意味着未定义的行为

由于 - 根据定义 - 没有从 UB 恢复的明智方法,您可能希望立即终止您的程序,而不是执行可能产生任何结果的进一步操作 - 包括非常不受欢迎的结果。

【讨论】:

  • 为什么有的软件一关掉,电脑还是老慢,还要重启?
  • @Tez:可能有几个原因,但 AFAIK 这不太可能,因为内存未释放。现代操作系统(至少是那些在台式计算机上运行的操作系统,不确定嵌入式操作系统)确实会在进程终止时释放进程分配的内存。
  • @Tez 有时关闭应用程序窗口并不会终止整个程序。通常应该关闭的后台进程可能会继续运行并占用您的系统资源。
  • 建议不正确。程序结束时内存释放没有黑白答案,正确答案是:取决于
  • @AlokSave:如果你能详细说明一下,我会很高兴。为什么程序不应该关闭它打开的文件、关闭它打开的连接、释放它获得的内存、解锁它锁定的全局互斥锁等等?
【解决方案2】:

并非所有操作系统(在现代操作系统中这不是问题)都执行此操作,您最好不要依赖此属性。你可以看看这里: What REALLY happens when you don't free after malloc?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 2010-09-26
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多