C ++程序崩溃的原因

C ++程序的异常行为通常会导致程序崩溃。您可能遇到了分段错误,异常终止,浮点异常等问题。以下是一些示例程序,可以帮助您了解C ++程序崩溃的原因。

异常

C ++中的异常是程序遇到异常情况时的响应。如果使用try-catch块无法正确处理这些异常,则该程序将由于崩溃而崩溃。由于除零异常导致以下程序崩溃-

示例

#include <iostream>
int main(){
   int num1=10;
   int num2=0;
   int quotient=num1/num2;
   printf("\n Quotient is: %d",quotient);
   return 0;
}

输出结果

如果我们运行上面的代码,它将生成以下输出-

Floating point exception (core dumped)

缓冲区溢出

缓冲区是一个临时存储区。当将数据写入缓冲区的程序超出缓冲区可以容纳的大小时,多余的数据将超出缓冲区的边界。数据将覆盖相邻的存储位置。当输入超出大小时,以下程序将更改其行为,变量num可以保存。

示例

#include <iostream>
#include <string.h>
int main(){
   int num=100;
   std::cout<<"\nValue for num:"<<num;
   char c[2];
   strcpy(c,"abcdefghijklmnopqrstuvwxyz");
   std::cout<<"\nValue for c:"<<c;
   return 0;
}

输出结果

如果我们运行上面的代码,它将生成以下输出-

Value for num:100
Segmentation fault (core dumped)

堆栈溢出

当调用堆栈指针超出堆栈界限时,将发生堆栈溢出问题。堆栈包含有限的空间。当程序使用的空间超过堆栈上的可用空间时,则表示堆栈溢出并导致程序崩溃。最常见的原因是无限递归。

以下程序包含对function的无限调用factorial()。在这种情况下,return语句不合适。

示例

#include <iostream>
#include <string.h>
int factorial(int num){
   if(num==0)
      return 1;
   else
      return(factorial(num));
}
int main(){
   int n=10;
   int fact=factorial(n);
   std::cout<<fact;
}

输出结果

如果我们运行上面的代码,它将生成以下输出-

Segmentation fault (core dumped)

内存区段错误

当程序尝试访问不属于它的内存位置时,就会发生分段错误或核心转储。在下面的程序中,指针str正在无限地递增和追加内存。

示例

#include <iostream>
int main(){
   char *str;
   char name[]="iostream";
   str=name;
   while(1)
      (*str++)='a';
}

输出结果

如果我们运行上面的代码,它将生成以下输出-

Segmentation fault (core dumped)

内存泄漏

当动态分配的内存从未释放时,就会发生内存泄漏。当不再使用内存时,必须释放它。如果我们连续不断地分配内存,那么随着时间的流逝,这些内存泄漏将会增加,并最终导致程序崩溃。如下所示重复不良代码会导致内存泄漏-

示例

#include <iostream>
int main(){
   int *node;
   node = (int *) malloc(9999999);
   //免费(节点); 
}