程序终止后动态分配内存

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

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

如果您使用微控制器,MacOS 9或管理程序,DOS或Windows 3.x进行编程,那么您可能需要关注内存泄漏,从而使整个操作系统永久无法使用内存。

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

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

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

大多数操作系统都会释放这些内存,但依赖此行为是不好的做法。 某些操作系统不会释放此内存。 例如,嵌入式系统。 为了便于携带,请始终释放您分配的所有内存。

C / C ++没有垃圾收集function。 如果你分配内存并且没有释放内存,那么在程序执行继续时它是没有用的。 这称为内存泄漏。 执行完成后,OS会收回此内存并再次可供使用。

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

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