崩溃的程序和挂起的程序之间的区别

jas*_*ine 5 c++

崩溃的程序与在C++中挂起(变得无响应)的程序之间有什么区别(或原因)?

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

耗尽所有内存会导致程序挂起吗?或者崩溃?我在差异和原因之间有点困惑.

Leo*_*Hat 12

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

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

  • 死锁,通常由2个竞争资源的线程引起,每个线程都需要释放另一个线程所持有的资源.这种情况的一个常见原因是在多个线程内以不一致的顺序获取多个锁,从而导致常见的ABBA死锁模式(并且这与瑞典流行音乐没有任何关系).
  • Livelock,这意味着代码仍然在运行,但是你已经达到了一个你无法离开的状态.例如:
    • 2个进程/线程的状态不断变化,从未达到最终状态
    • 一个while循环,其中退出条件永远不会被满足,或者是一个无限循环(尽管这会拉伸"活锁"的定义).

根据问题评论更新

@Pop,Kristo:我实际上正在检查挂起的代码,但我发现内存泄漏存在一些问题.但我不确定内存泄漏是否导致程序挂起. - jasonline

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

  • 泄漏的大小
  • 泄漏频率
  • 申请寿命

内存泄漏可能导致2个不好的事情 - 进程的内存使用量不断增加,以及内存碎片化.如果操作系统无法提供连续的内存块,则这两种情况都可能导致无法在线路上分配内存.

在C++中,如果new操作员无法分配内存,std::bad_alloc则会抛出异常.这很可能会被操作系统捕获,从而导致崩溃(除非您在应用程序中为此异常编写了特定的处理程序,并且能够更优雅地处理它).