C ++での実行時エラーの例をいくつか挙げてください。


ベストアンサー

2つの定義が考えられます。

一般用語

ランタイムエラーは、プログラムの実行中に発生し、コンパイル時に検出できない無効な操作です。

たとえば、これを検討してください

#incude

int main()

{

int a=0, b=0;

std::cout << "getting the quotient. \n Two numbers, please" << std::endl;

std::cin >> a >> b;

auto z = a/b;

std::cout << "the quotient is" << z << std::endl;

}

このプログラムは「整形式」です。コンパイラは正常に変換でき、 OSは正常に実行します。

必要に応じてスペースで区切られた2つの整数を入力すると、想定どおりに整数の商が出力されます。

ただし、入力すると2番目の数字として「0」、または何かを入力した場合tが数値ではないか、数値として解析できない場合は、0による整数除算になります。CPUが実行できず、何かがそれに反応することを期待して割り込み信号が発行されるもの。 (OSからの標準的な反応は、CRTのデフォルトのシグナルハンドラーが「terminate()」を呼び出すプログラムにシグナルを渡すことです。

特定のC ++用語:ランタイムエラーは、throw ステートメントに与えられたstd::runtime\_errorから派生したクラスのインスタンスです。

期待どおりに完了できない操作を関数が検出した場合は、そのような例外をスローして、呼び出し元が間違いを管理できるようにする必要があります。

次に、より「穏やか」にしようとします。

#include

#include

#include

class divide\_by\_zero: public std::runtime\_error

{ public: using std::runtime\_error::runtime\_error; };

// filter a divide by zero runtime error

auto div(int a, int b)

{

if(!b)

{ throw divide\_by\_zero("attempt to divide by zero"); }

return a/b;

}

// clear a stream status, and discard input up to a "\n"

void discard\_input(std::istream& s)

{

s.clear();

s.ignore(std::numeric\_limits::max(),"\n");

}

int main()

{

for(;;)

{

try

{

int a=0; b=0;

std::cout << "Getting the quotient: Two numbers, please" << std::endl;

std::cin >> a >> b;

auto z = div(a,b);

std::cout << "The quotient is " << z << std::endl;

return 0;

}

catch(std::exception& e) //whatever exception

{

std::cout << "Error in computation: " << e.what() << "\n";

std::cout << "Bad input - retry!" << std::endl;

discard\_input(std::cin);

}

}

}

できます実際に除算を行うdiv関数を参照してください。 「0」の除数の場合をフィルタリングすることはできますが、それ自体で問題を修正することはできません(除数が0である「理由」についての手がかりがないため、特定のアクションを実行できません。障害を「報告」します。例外。

以前のmainは、try ブロック内にあります。例外がスローされない場合は、動作します。前の例と同じです。

例外がスローされた場合、スコープは終了しますが、catchブロックは情報メッセージを出力し、「不正な入力」をクリーンアップします(したがって、状態フラグがリセットされます。 cin 状態のfail ビットを削除し、妥当なポイントまで「ダム文字」を無視します-次の \ n)ラップループを再実行します。

回答

実行時エラーは、プログラムの実行中に発生するエラーです。次のようなさまざまなタイプがあります。

  • 論理エラー:プログラムが期待される出力とは異なる出力を生成する場合。例-2つの数値を加算するプログラムを作成しましたが、誤って+記号ではなく-記号を付けました。
  • メモリリーク:プログラムはRAMを継続的に使い果たし、メモリ位置が他のタスクに使用されないようにします。彼らの仕事は終わった。無限ループを実行したり、使用済みメモリの割り当てを解除しなかったりすると、ループが発生する可能性があります。
  • クラッシュ:次のような多くの理由が原因である可能性があります:
  • 不足しているファイルの参照。画像を表示したいが、間違ったパスを指定すると、プログラムは画像を見つけられず、クラッシュします。
  • 物事をゼロで除算します。単純に、0で割ったものは定義されていません。プログラムはそれほど賢くなく、うまくいきません。
  • 間違った入力をします。プログラムの実行中に整数変数に文字を入力しようとしたことがありますか?はいの場合、あなたは何が起こるか知っています。など

お役に立てば幸いです…

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です