我们知道堆用于动态分配应用程序的内存。如果应用程序终止异常,堆内存如何被清除(从而避免内存泄漏)?
请考虑以下情况:
kill -9 <process_name>
在上述情况下,堆管理和清理是否有所不同? [请添加可能感兴趣的更多用例场景]
这个问题出现在我的脑海中,因为我们总是谈论确保代码中没有发生内存泄漏。现在我们如何处理强制关闭应用程序的情况,这可能导致程序退出而不调用内存空闲调用。
如果重复发生此类内存泄漏,操作系统是否可能缺少堆内存?或者OS有办法处理它......
答案 0 :(得分:6)
假设操作系统是Unix或Windows的典型实现,当应用程序被杀死时,操作系统会释放堆内存,无论它被杀死的方法是什么。
显然,其他操作系统可能无法做到这一点,并且由每个操作系统以有意义的方式解决这个问题 - 我不知道任何操作系统不会“在被杀死的进程后清理”,但我我相信在这个世界的某个角落可能存在这样的事情。
编辑:可能有其他资源不太容易发布,例如共享内存或多个使用的信号量。但大多数操作系统倾向于通过释放被杀死的应用程序的引用来处理这些问题,并让其他等待任何“可等待对象”(互斥,信号量等)的进程“让它们运行”。
答案 1 :(得分:2)
“堆通常由运行时在应用程序启动时分配,并在应用程序(技术过程)退出时回收”,因此异常/正常地杀死/关闭应用程序不会泄漏任何内存。
答案 2 :(得分:1)
对于动态内存管理,您应该使用 RAII (智能指针是一个示例)来处理异常期间的内存泄漏和管理等等。
如果您的应用程序退出,操作系统只会回收它为进程提供的所有内存。操作系统不了解泄漏,它只是收回它给进程的内容。所以本身没有泄漏。所有内存都被回收。您可能会泄漏其他资源(文件描述符等),但聪明地使用RAII应该可以防范这一点。
答案 3 :(得分:0)
关闭进程并不重要,操作系统内存管理器在关闭时会释放从该进程分配的剩余内存。在进程终止之前释放所有内存是很好的做法,但是在进程关闭后,OS /其他应用程序的可用堆都是相同的。