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); }