gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:03:22 25 4
gpt4 key购买 nike

在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com