首页 文章

程序终止后动态分配内存

提问于
浏览
21

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

5 回答

  • 33

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

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

  • 8

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

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

  • 1

    简答:是的,操作系统会释放这个记忆 .

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

  • 5

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

  • 2

    在程序执行期间,您无法依赖回收内存的操作 . 这将是许多其他语言(如Java和C#)中的垃圾收集功能 . 虽然垃圾收集c是可能的,但我不相信任何主流实现使用它 .

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

相关问题