📜  C++程序崩溃的原因

📅  最后修改于: 2021-05-30 03:52:51             🧑  作者: Mango

有时我们会遇到C++程序的异常崩溃。以下是一些可能导致C++异常崩溃的可能原因。

  • 分段错误:这是程序崩溃的主要原因。这些可能是造成这种原因的原因:
    • 尝试访问系统中不存在的内存位置。
    • 可能试图在只读存储器位置上进行写操作。
      // CPP program to demonstrate
      int main()
      {
         char *str; 
         
         /* Stored in read only part of data segment */
         str = "GfG";     
         
         /* Problem:  trying to modify read only memory */
         *(str+1) = 'n'; 
         return 0;
      }
      

      输出 :

      Segmentation fault (core dumped)
    • 可能试图访问受保护的内存位置,例如内核内存
    • 堆栈溢出:在某些情况下,可能无法终止具有内存位置的递归
      // C program to demonstrate stack overflow
      // by creating a non-terminating recursive
      // function.
      #include
        
      void fun(int x)
      {
          if (x == 1)
             return;
          x = 6;
          fun(x);
      }
        
      int main()
      {
         int x = 5;
         fun(x);
      }
      

      输出 :

      Segmentation fault (core dumped)
  • 缓冲区溢出:这是一种异常,其中程序在将数据写入缓冲区时会溢出缓冲区的边界并覆盖相邻的内存位置。

    • 考虑下面的C++程序。
      // C++ code to demonstrate buffer
      // overflow.
      #include 
      using namespace std;
        
      // driver code
      int main()
      {
          char A[8] = "";
          unsigned short B = 1979;
          strcpy(A, "excessive");
          return 0;
      }
      

      输出 :

      *** stack smashing detected ***: /home/gfg/a terminated
      Aborted (core dumped)

      该程序有两个在内存中相邻的变量:一个8字节长的字符串缓冲区A和一个两个字节的big-endian整数B。

      最初,A仅包含零字节,B包含数字1979。

      现在,程序尝试将以ASCII编码的空终止字符串“ excessive”存储在A缓冲区中。

      该字符串的长度为9个字符,编码为10个字节(包括空终止符),但是A只能占用8个字节。通过不检查字符串的长度,它还会覆盖B的值:

      B的值现在已经通过从字符字符串的一部分形成有多个被无意中取代。在此示例中,“ e”后跟零字节将变为25856。

      此溢出称为缓冲区缓冲区溢出

  • 内存泄漏:
    如果我们通过某个程序分配一些内存并保持原样。一段时间后,将分配但不使用巨大的内存,因此一段时间后将缺少内存。因此程序开始崩溃。
    // C program to demonstrate heap overflow
    // by continuously allocating memory
    #include
       
    int main()
    {
        for (int i=0; i<10000000; i++)
        {
           // Allocating memory without freeing it
           int *ptr = (int *)malloc(sizeof(int));
        }
    }
    
  • 例外情况
    • 除以零。
      // C++ code to demonstrate divide by 0.
      #include 
      using namespace std;
        
      // driver code
      int main()
      {
          int x = 10;
          int y = 0;
          cout << x/y;
          return 0;
      }
      

      输出 :

      Floating point exception (core dumped)
想要从精选的最佳视频中学习并解决问题,请查看有关从基础到高级C++的C++基础课程以及有关语言和STL的C++ STL课程。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”