【发布时间】:2011-12-27 21:03:08
【问题描述】:
我已经读过了-
由 malloc 分配的内存(例如)未释放的内存 程序终止时释放使用 free() 函数。并且 它是由操作系统完成的。那么什么时候有或没有 有垃圾收集器吗?
还是不是所有的操作系统都会在程序终止时自动释放内存?
【问题讨论】:
标签: c memory memory-management pointers malloc
我已经读过了-
由 malloc 分配的内存(例如)未释放的内存 程序终止时释放使用 free() 函数。并且 它是由操作系统完成的。那么什么时候有或没有 有垃圾收集器吗?
还是不是所有的操作系统都会在程序终止时自动释放内存?
【问题讨论】:
标签: c memory memory-management pointers malloc
关于malloc 和free 的说法适用于所有现代计算操作系统。但整个声明反映了对垃圾收集的目的的完全误解。
您调用free 的原因不是为了在程序终止后进行清理。您调用free 的原因是允许在后续执行长时间运行的程序期间重新使用内存。
考虑一个每秒处理一百条消息的消息服务器。当您收到新消息时,您拨打malloc。然后你必须用它做很多事情。您可能需要记录它。您可能必须将其发送给其他客户。您可能必须将其写入数据库。完成后,如果您不free 它,几天后您将有数百万条消息卡在内存中。所以你必须致电free。
但是什么时候你打电话给free?当一个客户端完成发送消息时,另一个客户端可能仍在使用它。也许数据库仍然需要它。
垃圾收集的目的是确保释放对象的已用内存(以便在应用程序的生命周期内重新使用它来保存新消息),而不必让应用程序程序员承担相关的责任(和风险)准确跟踪可能正在使用它的任何代码不再需要该对象的时间。
如果一个应用程序没有运行很长时间或者没有任何生命周期难以计算的对象,那么垃圾回收就不会起到很好的作用。还有其他技术(例如引用计数指针)可以提供许多与垃圾收集相同的好处。但是垃圾回收确实解决了一个真正的问题。
【讨论】:
大多数现代操作系统确实会释放您在程序终止时分配的所有内容。但是,垃圾收集器将在程序终止之前释放未使用的内存。这允许您的程序跳过空闲,但仍然设法无限期地分配内存,只要它允许对不再使用的内存的引用,并且只要您的总工作集大小不超过物理内存限制。
【讨论】:
当程序退出时,所有操作系统都会释放内存。内存泄漏只是一个问题,因为它们会浪费机器上的内存,或者导致程序崩溃。因此,您需要进行垃圾收集以防止这些事情发生,但不必担心在完成处理后实际释放您自己的指针。
它们是同一个问题的两种解决方案,真的。但是,正是因为问题发生在运行时,你才会担心它。
【讨论】:
想象一个长时间运行的进程,例如一个 Web 服务器,malloc()s 为它服务的每个连接提供一堆数据结构。如果它从不free()s 任何内存,则进程内存使用量将持续增长,可能会消耗系统上的所有可用资源。
【讨论】: