【发布时间】:2013-04-14 10:20:42
【问题描述】:
程序关闭时分配的新内存是否总是被释放? (即使因错误/错误等或自定义关闭功能意外关闭)?
还是只有从main返回才释放内存?
【问题讨论】:
-
XP,7,8 应该可以,但你应该自己检查一下
-
那么在我的错误处理函数中可以使用:exit, or abort/terminate?
程序关闭时分配的新内存是否总是被释放? (即使因错误/错误等或自定义关闭功能意外关闭)?
还是只有从main返回才释放内存?
【问题讨论】:
是的,操作系统通常会跟踪每个进程分配的内存,并在这些进程终止时释放它——无论如何。
然而,这不是在您的程序中一般存在内存泄漏的正当理由:程序应始终主动释放它获取的资源(包括内存) , 除非有一个非常好的 - 并且记录在案的 - 理由不这样做。
很好的理由可能是程序的正确性依赖于全局/单例对象的销毁顺序,或者在终止之前主动释放分配的内存的代价很高。
然而,尽管承认程序员有意避免释放内存可能是有原因的,但请注意不要形成一种过于肤浅的思维方式,即认为不释放内存是“很好的理由”自己打扫卫生。
我会鼓励你习惯于编写确实释放它所获得的内存的代码,并以非常清晰的形式明确记录你不要遵循这种做法的每一种情况。同样,虽然可能存在需要这样做的极端情况,但释放或不释放获得的内存始终必须是程序员的主动、有意决定。
注意: 引用 cmets 中的 Steve Jessop,另一个你不想主动释放内存的好理由是当你的程序需要终止时,因为它以某种方式达到了一个意外的状态 - 也许是一个这违反了不变量或某个函数的先决条件。通常,违反先决条件意味着未定义的行为。
由于 - 根据定义 - 没有从 UB 恢复的明智方法,您可能希望立即终止您的程序,而不是执行可能产生任何结果的进一步操作 - 包括非常不受欢迎的结果。
【讨论】:
并非所有操作系统(在现代操作系统中这不是问题)都执行此操作,您最好不要依赖此属性。你可以看看这里: What REALLY happens when you don't free after malloc?
【讨论】: