我的问题分为两部分:
我一直在阅读C ++中的内存管理,但无法找到有关我特定问题的任何内容。
答案 0 :(得分:5)
如果发生seg故障,操作系统负责清理程序保存的所有资源。
编辑:
现代操作系统将清除任何泄露的内存,无论程序如何终止。内存只会在程序的生命周期中泄漏。大多数操作系统还会清理许多其他类型的资源,例如打开文件和套接字连接。
答案 1 :(得分:4)
如果在分配内存之后发生段错误,是否可能 在释放它之前,这会泄漏内存(也就是说,内存永远不会 释放导致内存泄漏)?
是和否:崩溃的过程应完全由操作系统完成。但是请考虑您的流程产生的其他流程:它们可能不会完全终止。但通常这些不应该占用太多资源,但这可能会因您的计划而异。见http://en.wikipedia.org/wiki/Zombie_process
如果是这样,有没有办法确保清理已分配的内存 发生段错误的事件?
如果程序不重要(意味着如果它崩溃就没有生命危险)我建议修复分段错误。如果您确实需要能够处理分段错误,请参阅此主题的答案:How to catch segmentation fault in Linux?
更新:请注意,尽管可以处理SIGSEGV信号(并且在程序流程中继续),但这并不是一种安全的依赖方式,因为 - 正如下面的评论 - 它是未定义的行为,意味着不同的平台/编译器/ ......可能会有不同的反应。
因此,无论如何,修复分段错误(以及Windows上的访问冲突)都应该具有优先权。仍然使用建议的解决方案来处理信号这种方式必须经过彻底测试,如果放入生产代码,你必须了解它并得出任何后果 - 这可能会有所不同,取决于你的要求所以我不会说出任何名称。
答案 2 :(得分:2)
C ++标准不关心seg-faults(这是特定于平台的事情)。
在实践中,它实际上取决于你做了什么,以及你对“内存泄漏”的定义是什么。理论上,您可以为seg-fault信号注册一个处理程序,您可以在其中进行所有必要的清理。但是,任何现代操作系统都会自动清除终止过程。
答案 3 :(得分:0)
一,系统负责清理资源。其中之一就是记忆。您不必担心在段错误上永久泄露RAM。
二,系统不负责清理资源。您可以编写一个程序,将其pid插入数据库并在关闭时将其删除。这不会在段错误中删除。您可以1)添加一个处理程序来清理那种非系统资源,或者2)修复程序中的错误。
答案 4 :(得分:0)
现代操作系统将应用程序的内存分开,以便能够在它们之后进行清理。分段错误的问题在于它们通常仅在出现问题时才会发生。此时,默认行为是关闭应用程序,因为它不再按预期运行。
同样地,除非在某些奇怪的情况下,如果遇到分段错误,您的应用程序可能已经完成了一些您无法解释的问题。因此,“清理”可能几乎是不可能的。为了保证可接受的回滚状态,使用与事务数据库类似的内存并不是可能的,但是这样做(并且取决于级别的精细程度)可能超出了单调乏味。
更实用的版本可能是在应用程序组件之间提供您自己的沙盒,并在组件死亡时重新启动组件,将其恢复到可接受的先前保存状态批发。这样你就可以刷新所有已分配的内存并让它从头开始。但是,您仍然会丢失上次检查点时未保存的任何数据。