C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

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

  1. C++でのピラミッドのボリュームのプログラム

    ピラミッドのベースのタイプに応じて側面が与えられると、タスクはピラミッドの体積を計算することです。 ピラミッドは、ピラミッドの鋭いエッジを形成する共通点で外面が三角形で交わる3D図形です。ピラミッドの体積は、持つベースのタイプによって異なります。 -のように、ピラミッドを構成できるベースにはさまざまな種類があります。 三角形 -ピラミッドの体積よりも、ピラミッドの底辺が三角形になることを意味します 式-:( 1/6)* a * b * h 正方形 -ピラミッドの体積よりも、ピラミッドの底面が正方形になることを意味します 式-:(1/3)*(b ^ 2)* h 五角形 -ピラミッド

  2. QuickSort用のC++プログラム?

    クイックソートは、比較を使用してソートされていないリスト(配列)をソートするソート手法です。クイックソートは、パーティション交換ソートとも呼ばれます。 等しいソート項目の相対的な順序が保持されないため、安定したソートではありません。クイックソートは配列を操作できるため、ソートを実行するために少量の追加メモリが必要です。常に最悪の場合のパーティションを選択するわけではないことを除いて、選択ソートと非常によく似ています。したがって、選択ソートのより適切な形式と見なすことができます。 QuickSortは、最も効率的な並べ替えアルゴリズムの1つであり、配列を小さい配列に分割することに基づいていま