4

众所周知,堆用于为应用程序动态分配内存。如果应用程序异常终止,如何清除堆内存(从而避免内存泄漏)?

考虑以下场景:

  • 假设应用程序在 Windows 或 Linux 上突然崩溃。
  • 我们在 linux 中强制杀死一个应用程序:kill -9 <process_name>
  • Visual Studio 中的 C++ 程序在执行过程中引发错误。

在上述情况下,堆管理和清理有什么不同吗?[请在此处添加更多可能感兴趣的用例场景]

这个问题出现在我的脑海中,因为我们总是谈论确保代码中不会发生内存泄漏。现在我们如何处理强制关闭应用程序的情况,这可能导致程序退出而不调用内存释放调用。

如果这样的内存泄漏反复发生,操作系统是否可能会出现堆内存不足的情况?还是操作系统有办法处理它...

4

4 回答 4

7

假设操作系统是 Unix 或 Windows 的典型实现,那么堆内存会在应用程序被杀死时由操作系统释放,无论它被什么方法杀死。

显然,其他操作系统可能不会完全做到这一点,并且由每个操作系统以有意义的方式解决这个问题 - 我不知道任何操作系统不会“在杀死进程后进行清理”,但我敢肯定这种东西可能存在于这个世界的某个角落。

编辑:可能有其他资源不太容易释放,例如共享内存或多个使用的信号量。但是大多数操作系统倾向于通过释放被杀死的应用程序的引用来处理这些问题,并让等待任何“可等待对象”(互斥体、信号量等)的其他进程将“运行”。

于 2013-05-07T11:58:52.277 回答
2

“堆通常在应用程序启动时由运行时分配,并在应用程序(技术进程)退出时回收”,因此异常/正常地杀死/关闭应用程序不会泄漏任何内存。

于 2013-05-07T12:12:29.390 回答
1

至于动态内存管理,您应该使用RAII智能指针就是一个例子)来处理异常期间的内存泄漏和管理等。
在您的应用程序退出的情况下,操作系统只会收回它提供给进程的所有内存。操作系统不理解泄漏,它只是收回它给进程的东西。所以本身没有泄漏。所有内存都被回收。您可能会泄漏其他资源(文件描述符等),但巧妙地使用 RAII 应该可以防止这种情况发生。

于 2013-05-07T11:58:06.107 回答
0

无论您的进程如何关闭,从该进程分配的任何剩余内存都会在它关闭时由操作系统内存管理器释放。在进程终止之前释放所有分配的内存是一个很好的做法,但是在进程关闭后,操作系统/其他应用程序的可用堆是相同的。

于 2013-05-07T11:55:18.477 回答