我读过这个 -
由malloc(例如)分配但未释放的内存 程序终止时释放使用free()函数 这是由opearting系统完成的。那么什么时候有或没有 有一个垃圾收集器进入图片?
或者并非所有操作系统都在程序终止时自动释放内存?
答案 0 :(得分:5)
关于malloc
和free
的声明对于所有现代计算操作系统都是正确的。但整个声明反映了对垃圾收集的目的的完全误解。
调用free
的原因不是在程序终止后清理它。调用free
的原因是允许在后续执行长时间运行的程序期间重用内存。
考虑一个每秒处理一百条消息的消息服务器。收到新消息时,请致电malloc
。然后你必须用它做很多事情。您可能需要记录它。您可能必须将其发送给其他客户。您可能必须将其写入数据库。当你完成后,如果你没有free
它,几天之后你就会有数百万条信息被困在内存中。所以你有来呼叫free
。
但当你打电话给free
时?当一个客户端完成发送消息时,另一个客户端可能仍在使用它。也许数据库仍然需要它。
垃圾收集的目的是确保释放对象的已用内存(因此可以在应用程序的生命周期内重新使用它来保存新消息),而不必使应用程序员负担相关的职责(和风险)跟踪可能正在使用它的任何代码不再需要该对象的时间。
如果应用程序运行时间不长或者没有任何生命周期很难弄清楚的对象,那么垃圾收集就不会有太大的好处。还有其他技术(例如引用计数指针)可以提供许多与垃圾收集相同的好处。但垃圾收集确实存在一个真正的问题。
答案 1 :(得分:1)
大多数现代操作系统确实会释放您在程序终止时分配的所有内容。但是,垃圾收集器将在程序终止之前释放未使用的内存。这允许你的程序跳过释放,但仍然设法无限期地分配内存,只要它允许引用不再使用的内存,并且只要你的总工作集大小不超过物理记忆限制。
答案 2 :(得分:0)
程序退出时,所有操作系统都会释放内存。内存泄漏“只是”一个问题,因为它们会浪费机器上的内存,或导致程序崩溃。因此,您需要进行垃圾收集以防止这些事情发生,但不必担心在完成这些操作后实际释放自己的指针。
他们是解决同一问题的两个解决方案。但是,这是因为问题发生在运行时期间,你担心它。
答案 3 :(得分:0)
想象一个长期运行的过程,就像一个Web服务器malloc()
为它服务的每个连接提供了大量数据结构。如果它永远不会free()
任何内存,那么进程内存使用量将不断增长,可能会消耗系统上可用的所有内容。