2

C ++で間違った配列参照をキャッチするにはどうすればよいですか?次のコードが機能しないのはなぜですか。

    #include <exception>

    int * problemNum = new int;
    int (* p [100])() = {problem1, problem2, problem3};

    ...

    try {
        cout << (*p[*problemNum-1])();
    }
    catch (exception){
        cout << "No such problem";
    }

私のコンパイラは次のように言っています:Euler.exeの0xccccccccで未処理の例外:0xC0000005:アクセス違反。0*problemNumとして入力して不正な参照を開始したとき。

4

2 に答える 2

4

alamar は正しいです。C++ は、このタイプの配列では例外をキャッチしません。

代わりに STL ベクトルを使用します。

#include <exception>
#include <vector>

int * problemNum = new int;
std::vector<int(*)()> p;
p.push_back(problem1);
p.push_back(problem2);
p.push_back(problem3);

...

try {
    cout << p.at(*problemNum-1)();
}
catch (exception){
    cout << "No such problem";
}
于 2009-05-22T22:22:21.597 に答える
3

C ++は、その例外メカニズムではそのようなエラーを処理できないためです。その問題については、欠陥のあるC++を参照してください。

を使用しsigaction(2)ます。

sigaction-シグナルアクションを調べて変更します

概要

   #include <signal.h>

   int sigaction(int signum, const struct sigaction *act,
                 struct sigaction *oldact);

説明sigaction()システムコールは、特定のシグナルを受信したときにプロセスが実行するアクションを変更するために使用されます。signumはシグナルを指定し、SIGKILLとSIGSTOPを除く任意の有効なシグナルにすることができます。actがnull以外の場合、シグナルシグナムの新しいアクションがactからインストールされます。oldactがnull以外の場合、前のアクションはoldactに保存されます。sigaction構造は、次のように定義されます。

       struct sigaction {
           void     (*sa_handler)(int);
           void     (*sa_sigaction)(int, siginfo_t *, void *);
           sigset_t   sa_mask;
           int        sa_flags;
           void     (*sa_restorer)(void);
       };

SIGSEGVをキャッチする必要があります。独自のハンドラー(不正なメモリアクセスが実行されたときに呼び出される関数)をアタッチできます。

于 2009-05-22T22:10:26.567 に答える