6

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

还是仅在从 main 返回时才释放内存?

4

2 回答 2

5

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

然而,这并不是在你的程序出现内存泄漏的正当理由:一个程序应该总是主动释放它所获得的资源(包括内存),除非有一个非常好的 - 并且记录在案的 - 不这样做的理由。

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

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

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


注意:引用评论中的史蒂夫·杰索普的话,另一个你不想主动释放内存的好理由是当你的程序需要终止时,因为它以某种方式达到了意想不到的状态——可能是违反不变量的状态,或者是一定的功能。通常,违反先决条件意味着Undefined Behavior

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

于 2013-04-14T10:21:42.510 回答
1

并非所有操作系统(在现代操作系统中这不是问题)都执行此操作,您最好不要依赖此属性。你可以看看这里: 当你在 malloc 之后不释放时,真正发生了什么?

于 2013-04-14T10:22:37.317 回答