c语言 - 未释放的内存



我已经读过了-

由malloc(例如)分配且未释放的内存使用free()函数在程序终止时被释放。和它是由操作系统完成的。所以什么时候有或没有让一个垃圾收集器进入你的脑海?

或者不是所有的操作系统都在程序终止时自动释放内存?

关于mallocfree的说法对于所有现代计算操作系统都是正确的。但是,从整体上看,这句话反映了对垃圾收集的目的的完全误解。

调用free的原因不是为了在程序终止后清理东西。调用free的原因是允许在长时间运行的程序的后续执行期间重用内存。

考虑一个每秒处理100条消息的消息服务器。当您收到一条新消息时,调用malloc。然后你要用它做很多事情。你可能需要记录一下。你可能要把它发给其他客户。您可能必须将其写入数据库。当你完成后,如果你不free它,几天后你将有数百万条消息卡在内存中。所以你调用free

但是什么时候调用free呢?当一个客户机发送完消息后,另一个客户机可能仍在使用它。也许数据库还需要它。

垃圾收集的目的是确保对象已使用的内存被释放(这样它就可以在应用程序的生命周期内被重用来保存新消息),而不必给应用程序程序员负担跟踪对象何时不再被任何可能使用它的代码所需要的责任(和风险)。

如果一个应用程序不会运行很长时间,或者没有任何生命周期难以计算的对象,那么垃圾收集就不会有太大的作用。还有其他技术(如引用计数指针)可以提供许多与垃圾收集相同的好处。但是垃圾收集确实解决了一个真正的问题。

大多数现代操作系统确实会在程序终止时释放您分配的所有内容。但是,垃圾收集器将在程序终止之前释放未使用的内存。这允许你的程序跳过自由,但仍然设法无限期地分配内存,只要它允许对不再使用的内存的引用,只要你的总工作集大小不超过物理内存限制。

所有操作系统都在程序退出时释放内存。内存泄漏"仅仅"是一个问题,因为它们浪费了机器上的内存,或者导致程序崩溃。所以你可以通过垃圾收集来防止这些事情的发生,而不用担心当你用完指针后会释放你自己的指针。

他们是同一个问题的两种解决方案,真的。但是,这是因为问题发生在运行时,你担心它

想象一个长时间运行的进程,就像一个web服务器,malloc()是它所服务的每个连接的一堆数据结构。如果它从来没有free()占用任何内存,那么进程的内存使用将持续增长,可能会消耗系统上所有可用的内存。

相关内容

  • 没有找到相关文章

最新更新