C++ SEG故障和内存泄漏

C++ SEG故障和内存泄漏,c++,c,memory-management,C++,C,Memory Management,我的问题分为两部分: 如果segfault在分配内存后但在释放之前发生,是否会导致内存泄漏(即,内存从未释放,导致内存泄漏) 如果是,有没有办法确保在发生segfault时清除分配的内存 我一直在读C++中的内存管理,但是找不到关于我的特定问题的任何东西。 < P> C++标准不关心SEG错误(这是平台特定的事情)。 实际上,这实际上取决于你做了什么,以及你对“内存泄漏”的定义。理论上,您可以为seg故障信号注册一个处理程序,在该处理程序中,您可以执行所有必要的清理。但是,任何现代操作系统都

我的问题分为两部分:

  • 如果segfault在分配内存后但在释放之前发生,是否会导致内存泄漏(即,内存从未释放,导致内存泄漏)
  • 如果是,有没有办法确保在发生segfault时清除分配的内存

<>我一直在读C++中的内存管理,但是找不到关于我的特定问题的任何东西。

< P> C++标准不关心SEG错误(这是平台特定的事情)。
实际上,这实际上取决于你做了什么,以及你对“内存泄漏”的定义。理论上,您可以为seg故障信号注册一个处理程序,在该处理程序中,您可以执行所有必要的清理。但是,任何现代操作系统都会自动清除终止进程。

在seg故障的情况下,操作系统负责清除程序保留的所有资源

编辑:


无论程序如何终止,现代操作系统都会清除任何泄漏的内存。内存仅在程序生命周期内泄漏。大多数操作系统还将清理许多其他类型的资源,如打开的文件和套接字连接。

首先,系统负责清理一些资源。其中之一是记忆。您不必担心segfault上永久泄漏的RAM

第二,系统不负责清理资源。您可以编写一个程序,将其pid插入数据库,并在关闭时将其删除。这不会在发生故障时删除。您可以1)添加处理程序来清理此类非系统资源,或者2)首先修复程序中的错误

如果在分配内存后发生segfault,但 在释放它之前,这会泄漏内存(也就是说,内存永远不会被释放) 已释放(导致内存泄漏)

是和否:崩溃的进程应该完全由操作系统控制。然而,考虑过程中产生的其他过程:它们可能不会完全终止。然而,通常这些不应该占用太多的资源,但这可能因您的程序而异。看

如果是这样的话,有没有办法确保分配的内存在 发生故障的事件

如果程序是非关键的(意味着如果它崩溃就不会有生命危险),我建议修复分段错误。如果您确实需要能够处理分段故障,请参阅本主题的答案:

更新:请注意,尽管可以处理SIGSEGV信号(并在程序流中继续),但这不是一种安全的依赖方式,因为正如下面的评论所指出的,这是一种未定义的行为,意味着不同的平台/编译器/。。。可能会有不同的反应


因此,无论如何,修复分段错误(以及windows上的访问冲突)应该是首要任务。仍然使用建议的解决方案以这种方式处理信号必须经过彻底的测试,如果放入生产代码中,您必须意识到这一点并得出任何后果-这可能会有所不同,并取决于您的要求,因此我不会列举任何后果

现代操作系统将应用程序的内存分开,以便能够在应用程序之后进行清理。分段错误的问题是,它们通常只在出现问题时出现。此时,默认行为是关闭应用程序,因为它不再按预期运行

类似地,除非在某些奇怪的情况下,否则您的应用程序很可能做了一些在遇到分段错误时无法解释的事情。因此,“清理”几乎是不可能的。为了保证可接受的回滚状态,谨慎地使用类似于事务数据库的内存并不是不可能的,但是这样做(取决于级别的细粒度)可能会非常繁琐


更实用的版本可能是在应用程序组件之间提供您自己的沙盒,并在组件死机时重新启动组件,将其恢复到可接受的先前保存状态。这样,您就可以刷新所有分配的内存,让它从头开始。但是,您仍然会丢失截至上一个检查点尚未保存的所有数据。

这不一定是真的。应用程序可能捕捉到信号并尝试优雅地处理它。但是当然,在99.9%的情况下,要让程序转储堆栈并以错误代码终止在技术上是非常困难的。在这种情况下,你是对的——操作系统释放了大部分但不一定是流程中的所有资源。它还取决于操作系统和应用程序。例如,它可能是设备驱动程序segfaulting:),即使应用程序捕获了segfault。当应用程序关闭时,操作系统将清理内存。或者它应该清理它。@VladLazarenko如果设备驱动程序出现故障,操作系统将崩溃,需要重新启动。这意味着所有的内存都将被恢复。@JamesKanze:不一定。内核可以尝试从设备驱动程序故障中恢复。有时它会使自己变得无用,并且不会重新启动。关于提到的文章:接受的响应完全是错误的;无法将信号转换为异常。最后,我将修复SEGFULT;我只是担心调试的可能性,同时会造成大量内存泄漏。非常感谢@JamesKanze我还没有测试linke文章的答案,但是链接库和它的代码在我看来似乎是合理的,答案的作者说他已经测试过了。虽然我同意不做额外工作就使用try-catch是不可能的,但我的问题是:为什么您认为建议的解决方案根本不可能?@Vash在信号处理程序中引发异常是未定义的行为。在许多系统上,它将在99.9%的时间内工作,并且