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)

栈溢出

栈溢出问题发生在调用栈指针超过栈边界时。栈包含有限量的空间。当程序使用的空间超过栈上可用的空间时,就会发生栈溢出,导致程序崩溃。最常见的原因是无限递归。

以下程序包含对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);
   // free(node);
}

更新于: 2020年8月13日

948 次查看

开启你的职业生涯

通过完成课程获得认证

开始学习
广告