程序终止后动态分配的内存
dynamically allocated memory after program termination
当包含动态分配的内存(使用malloc/new)而没有调用free/delete调用的C/c++程序被终止时,动态分配的内存会发生什么?操作系统是否会收回内存,或者其他程序是否无法访问该内存?
我不认为在语言标准中有任何保证,但是支持稀疏虚拟内存和内存保护的现代操作系统(例如MacOS X, Linux,所有最新版本的Windows,以及所有当前生产的手机)会在行为不良的进程(当它们终止时)自动清理并为您释放内存。但是,只要程序在运行,内存仍然不可用。
如果你在微控制器上编程,在MacOS 9或更早的版本,DOS或Windows 3上。X,那么您可能需要担心内存泄漏使整个操作系统永远无法使用内存。
大多数现代操作系统都使用内存管理器,所有用户域进程只能看到所谓的虚拟内存,这与程序可以检查的实际系统内存没有关系。这意味着程序不能简单地读取另一个进程的内存或内核内存。这也意味着当进程终止时,内存管理器将完全"释放"分配给该进程的所有内存,因此程序中的内存泄漏通常不会"影响"系统的其余部分(除了可能强制大量磁盘交换和可能一些"内存不足"行为)。
这并不意味着可以以任何方式轻松对待内存泄漏,它只意味着在现代多任务操作系统上,没有一个程序可以随意破坏其他进程(当然,尽管故意滥用管理权限)。
简短的回答:是的,操作系统会释放这些内存。
大多数操作系统将释放此内存,但是依赖此行为是不好的做法。某些操作系统不会释放此内存。例如,嵌入式系统。为了可移植性,总是释放你分配的所有内存。
C/c++没有垃圾收集功能。如果您分配了内存,但没有释放,那么在程序继续执行时,内存就没有任何用处。这被称为内存泄漏。一旦执行完成,操作系统收回这些内存并再次可供使用。
在程序执行期间,您不能指望操作会回收内存。这可能是许多其他语言(如Java和c#)中都有的垃圾收集特性。虽然垃圾回收c++是可能的,但我不相信任何主流实现使用它。
另一方面,一旦你的程序完成了它的执行,操作系统应该回收被程序使用的内存。因此,在执行期间内存仍然是禁止的,但在程序退出后可以再次访问。
- 对具有动态分配的内存和析构函数的类对象的引用
- 调用析构函数以释放动态分配的内存
- 在运行时为动态分配的内存输入值
- 释放动态分配的内存时是否需要执行此额外步骤
- 动态分配字符数组的内存
- 销毁C++中动态分配的内存(数组对象)
- 删除类成员的动态分配内存的最佳方法是什么
- 动态分配的内存构造函数
- 为什么动态分配的内存总是16字节对齐
- 如果您为类的一个对象动态分配内存作为参数,会发生什么
- 为什么动态分配的两个变量的内存位置不是连续的?
- 为浮点数组动态分配内存
- 动态分配 8 字节的内存
- 包含动态分配内存作为值的映射的取消定位速度有多快?
- STD分配器是否会在堆上动态分配内存?它可以安全地删除内存吗?
- 为什么不能在 Visual C++ 中动态分配堆栈内存?但海湾合作委员会可以做到
- 在C 中动态分配的内存的问题
- 为什么在 C++ 执行删除操作后仍可以访问释放的动态分配的内存
- 对内存动态分配的类不使用"*"的逻辑
- 如果我将内存动态分配给静态变量,我应该释放它还是会自动释放它