当包含动态分配的内存(使用malloc / new)而没有空闲/删除调用的C / C ++程序终止时,动态分配的内存会发生什么? 操作系统是否收回内存或者其他程序无法访问该内存?
答案 0 :(得分:33)
我不认为语言标准有任何保证,但现代操作系统支持稀疏虚拟内存和内存保护(例如MacOS X,Linux,所有最新版本的Windows以及所有当前制造的手机)在行为不当的进程(终止时)后自动清理并为您释放内存。只要程序正在运行,内存仍然不可用。
如果您使用微控制器,MacOS 9或管理程序,DOS或Windows 3.x进行编程,那么您可能需要关注内存泄漏,从而使整个操作系统永久无法使用内存。
答案 1 :(得分:8)
大多数现代操作系统都使用内存管理器,并且所有用户空间进程只能看到所谓的虚拟内存,这与程序可以检查的方式与实际系统内存无关。这意味着程序不能简单地读取另一个进程的内存或内核内存。这也意味着内存管理器将完全“释放”该进程终止时分配给进程的所有内存,以便程序中的内存泄漏通常不会“影响”系统的其余部分(除了可能强制执行大量的磁盘交换,也许还有一些“内存不足”行为。
这并不意味着以任何方式轻松处理内存泄漏,这只意味着没有任何单个程序可以随意破坏现代多任务操作系统上的其他进程(尽管故意滥用管理权限,疗程)。
答案 2 :(得分:5)
简短回答:是的,操作系统将释放这段记忆。
大多数操作系统都会释放这些内存,但依赖此行为是不好的做法。某些操作系统不会释放此内存。例如,嵌入式系统。为了便于携带,请始终释放您分配的所有内存。
答案 3 :(得分:2)
C / C ++没有垃圾收集功能。如果你分配内存并且没有释放内存,那么在程序执行继续时它是没有用的。这称为内存泄漏。一旦执行完成,操作系统将收回此内存并再次可供使用。
答案 4 :(得分:1)
在程序执行期间,您无法指望操作回收内存。这将是许多其他语言(如Java和C#)中的垃圾收集功能。虽然垃圾收集c ++是可能的,但我不相信任何主流实现都使用它。
另一方面,一旦程序完成执行,操作系统应该回收程序使用的内存。因此在执行期间,内存保持禁止,但在程序退出后可以再次访问。