程序终止后动态分配的内存

dynamically allocated memory after program termination

本文关键字:内存 动态分配 终止 程序      更新时间:2023-10-16

当包含动态分配的内存(使用malloc/new)而没有调用free/delete调用的C/c++程序被终止时,动态分配的内存会发生什么?操作系统是否会收回内存,或者其他程序是否无法访问该内存?

我不认为在语言标准中有任何保证,但是支持稀疏虚拟内存和内存保护的现代操作系统(例如MacOS X, Linux,所有最新版本的Windows,以及所有当前生产的手机)会在行为不良的进程(当它们终止时)自动清理并为您释放内存。但是,只要程序在运行,内存仍然不可用。

如果你在微控制器上编程,在MacOS 9或更早的版本,DOS或Windows 3上。X,那么您可能需要担心内存泄漏使整个操作系统永远无法使用内存。

大多数现代操作系统都使用内存管理器,所有用户域进程只能看到所谓的虚拟内存,这与程序可以检查的实际系统内存没有关系。这意味着程序不能简单地读取另一个进程的内存或内核内存。这也意味着当进程终止时,内存管理器将完全"释放"分配给该进程的所有内存,因此程序中的内存泄漏通常不会"影响"系统的其余部分(除了可能强制大量磁盘交换和可能一些"内存不足"行为)。

这并不意味着可以以任何方式轻松对待内存泄漏,它只意味着在现代多任务操作系统上,没有一个程序可以随意破坏其他进程(当然,尽管故意滥用管理权限)。

简短的回答:是的,操作系统会释放这些内存。

大多数操作系统将释放此内存,但是依赖此行为是不好的做法。某些操作系统不会释放此内存。例如,嵌入式系统。为了可移植性,总是释放你分配的所有内存。

C/c++没有垃圾收集功能。如果您分配了内存,但没有释放,那么在程序继续执行时,内存就没有任何用处。这被称为内存泄漏。一旦执行完成,操作系统收回这些内存并再次可供使用。

在程序执行期间,您不能指望操作会回收内存。这可能是许多其他语言(如Java和c#)中都有的垃圾收集特性。虽然垃圾回收c++是可能的,但我不相信任何主流实现使用它。

另一方面,一旦你的程序完成了它的执行,操作系统应该回收被程序使用的内存。因此,在执行期间内存仍然是禁止的,但在程序退出后可以再次访问。