Перехват неверной ссылки на массив в C ++ - PullRequest
2 голосов
/ 23 мая 2009

Как мне отловить неправильную ссылку на массив в C ++? Почему не работает следующий код:

    #include <exception>

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

    ...

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

Мой компилятор говорит: Необработанное исключение в 0xcccccccc в Euler.exe: 0xC0000005: нарушение прав доступа. когда я инициирую неверную ссылку, введя 0 как * problemNum.

Ответы [ 2 ]

4 голосов
/ 23 мая 2009

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";
}
3 голосов
/ 23 мая 2009

Becauce C ++ не может обрабатывать такие ошибки с помощью механизма исключений. См. Неисправный C ++ по этому вопросу.

Использование sigaction(2).

sigaction - проверить и изменить действие сигнала

1012 * СИНТАКСИС *

   #include <signal.h>

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

ОПИСАНИЕ Системный вызов sigaction () используется для изменения действия, выполняемого процессом при получении определенного сигнал. signum определяет сигнал и может быть любым действительным сигналом, кроме SIGKILL и SIGSTOP. Если act не нуль, новое действие для сигнала signum устанавливается из act. Если oldact не нуль, предыдущее действие сохраняется в 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, вы можете прикрепить свой собственный обработчик (функция, которая вызывается при выполнении незаконного доступа к памяти).

...