Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
崩溃程序和挂起程序之间的区别 P>在C++中,程序崩溃和程序挂起(变得无响应)有什么区别?_C++ - Fatal编程技术网

崩溃程序和挂起程序之间的区别 P>在C++中,程序崩溃和程序挂起(变得无响应)有什么区别?

崩溃程序和挂起程序之间的区别 P>在C++中,程序崩溃和程序挂起(变得无响应)有什么区别?,c++,C++,当然,访问无效内存会导致程序崩溃。线程中的死锁可能会导致程序挂起。其他原因是什么 耗尽所有内存是否会导致程序挂起?还是崩溃?我对这些差异及其原因感到有点困惑。挂起也可能是由于等待外部资源造成的,主要是网络资源。虽然这通常会在一段时间后超时。挂起也可能由处理与处理相关的内容的线程的终止引起。例如,如果一个UI线程分派了一个工作线程来执行某些工作,而该工作线程已死亡,则该程序将显示为挂起。很多时候,Windows应用程序挂起是因为它们的消息循环处理出了问题。由于一旦消息循环被破坏,所有程序事件都会通

当然,访问无效内存会导致程序崩溃。线程中的死锁可能会导致程序挂起。其他原因是什么


耗尽所有内存是否会导致程序挂起?还是崩溃?我对这些差异及其原因感到有点困惑。

挂起也可能是由于等待外部资源造成的,主要是网络资源。虽然这通常会在一段时间后超时。挂起也可能由处理与处理相关的内容的线程的终止引起。例如,如果一个UI线程分派了一个工作线程来执行某些工作,而该工作线程已死亡,则该程序将显示为挂起。

很多时候,Windows应用程序挂起是因为它们的消息循环处理出了问题。由于一旦消息循环被破坏,所有程序事件都会通过消息循环出现,因此程序将变得无响应

您可以在此处阅读有关消息循环工作原理的更多信息:


挂起和崩溃之间的一个重要因素是底层操作系统与为软件和硬件异常处理和/或保护机制提供的支持相关。例如,在旧的DOS环境中,在实模式下运行时,您可能会使用无效的内存访问挂起整个系统(因为386>DOS Extender会因异常而崩溃,至少是流行的DOS4GW)

用户模式应用程序的大多数异常和错误行为都可以在操作系统和运行库的适当支持下停止,死锁除外


当然,在内核模式代码中,挂起的可能性要高得多。

看起来您基本上已经回答了自己的问题

我还可以想到一些导致崩溃的其他原因:

  • 非法指令。例如,如果您在旧CPU上运行SSE代码
  • 糟糕的内存访问是相当模糊的。这种情况有一些子案例,例如在某些CPU上对字的不对齐访问、堆栈溢出、对未映射页的访问、写入只读页、执行不可执行页、并发访问导致损坏的不变量等等
  • 在Linux上,如果系统内存非常低,进程可能会被终止(看起来是随机的)。(有关详细信息,请参阅此搜索)
除了死锁之外,您还有:

  • UI线程被某些其他操作阻止(一些示例:I/O、在内存不足的情况下将页面逐出到磁盘)
  • 其他程序员错误,例如在未经测试的情况下从不终止的循环

崩溃通常是由非法指令引起的,例如访问无效内存、除以零等。这通常表现为操作系统处理的众所周知的异常

悬挂可分为两个相当高的级别类别:

  • 死锁,通常由两个线程竞争一个资源引起,每个线程都需要释放另一个线程持有的资源。造成这种情况的一个常见原因是,在多个线程中以不一致的顺序获取多个锁,从而导致出现公共锁(不,这与瑞典流行音乐无关)
  • Livelock,这意味着代码仍在积极运行,但已达到无法离开的状态。例如:
    • 2个进程/线程的状态不断变化,从未达到结束条件
    • 退出条件永远无法满足的while循环,或不确定循环(尽管这扩展了“livelock”的定义)
根据问题评论进行更新


@爸爸,克里斯托:我真的在检查 挂起的代码,但我看到一些 内存泄漏问题。但我不是 真的确定内存泄漏是否会导致 程序挂起jasonline

内存泄漏可能导致程序崩溃,但这取决于各种因素:

  • 泄漏的大小
  • 泄漏频率
  • 应用寿命
内存泄漏可能会导致两件坏事——进程不断增加内存使用量和内存碎片。如果操作系统不能提供连续的内存块,这两种情况都会导致分配内存失败


<> > C++中,如果<代码>新< /COD>运算符无法分配内存,则将引发<代码> STD:BADYOLLC/<代码>异常。这很可能会被操作系统捕获,从而导致崩溃(除非您在应用程序中为此异常编写了特定的处理程序,并且能够更优雅地处理它)。

从您的评论中可以看出,内存泄漏可能与挂起有关,但与挂起的原因无关。也就是说,您可能会遇到一些简单的问题,比如在某个地方有一个无限循环,它在每次迭代中都会占用更多的内存。

这不是一个真正的问题,可能导致崩溃的事情太多了,无法回答,而且这个列表有时是特定于硬件或操作系统的,或者可能还有很多其他因素。我认为我们无法以书面形式回答这个问题。程序可能会意外退出或失去响应,原因有很多。你能说得更具体些吗?@Pop,Kristo:我正在检查一个挂起的代码,但我发现内存泄漏有一些问题。但我不确定内存泄漏是否会导致程序挂起。@jasonline-我会更新我的答案,回答您的“内存泄漏”评论。崩溃和挂起的主要区别是崩溃通常会终止进程,而挂起会继续进程,但没有明显的进展。Dav:是,我理解这些影响,但我想知道更多的是他们的原因。感谢这些额外的信息。