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

标签 c++

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

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

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

最佳答案

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

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

  • 死锁,通常由2个线程竞争资源引起,每个线程都需要释放另一个线程持有的资源。一个常见的原因是在多个线程中以不一致的顺序获取多个锁,导致常见的 ABBA deadlock pattern。 (不,这与瑞典流行音乐无关)。
  • Livelock,意思是代码还在主动运行,但是你已经到了无法离开的状态。例如:
    • 2个进程/线程的状态不断变化,永远不会达到结束条件
    • 永远不会满足退出条件的while 循环,或无限循环(尽管这是在扩展“活锁”的定义)。

根据问题评论更新

@Pop, Kristo: Am actually checking on a code that hangs but I see some problems on memory leak. But I'm not really sure if memory leak causes a program to hang. – jasonline

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

  • 泄漏的大小
  • 泄漏频率
  • 应用程序的生命周期

内存泄漏可能会导致两件坏事 - 进程内存使用量的持续增加和内存碎片。如果操作系统无法提供连续的内存块,这两种情况都可能导致无法分配内存。

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

关于c++ - 崩溃的程序和挂起的程序之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1912047/

相关文章:

c++ - vs2010 (c++, win32) 文件写入

C++模板函数错误: variable or field 'swapAdjacent' declared void

c++ - 在 OSX 10.8.2 中覆盖 `new` 和 `delete` 时崩溃

c++ - Dev C++ 不显示我的所有输出

c++ - 如何在MFC中的每个CPropertyPage上OnInitDialog?

c++ - OpenCV 点类型转换

c++ - SD.remove() 没有删除 Arduino C++ 上的文件

c++ - Qt Creator 中只有有限的工具链

c++检查范围内值的通用方法

c++ - Directx11 - DeviceContext::ClearRenderTargetView 崩溃