Отказ
Такого рода вещи не хорошо для отладки кроме. Недостаточно оснований для продолжения вашей программы после исключения доступа к памяти, поскольку обычно это указывает на повреждение данных.
Тем не менее, я думаю, что лучше ответить на вопрос, чем осуждать, осуждать или подвергать цензуре.
Классы C++, полученные из exception
просто удобства поощрять хорошую практику среди программистов. У них нет специальной семантики, и они ничем не отличаются от названия.
Хуже, исключения C++ не могут проходить за пределами обработчика сигналов (что на других языках будет называться «обработчиком исключений», функция, вызываемая незаконным доступом). Стандарт имеет конкретное предупреждение об этом,
A [plain old function] that could be used as a signal handler in a conforming C program does not produce undefined behavior when used as a signal handler in a C++ program. The behavior of any other function used as a signal handler in a C++ pro- gram is implementation defined.213)
213) In particular, a signal handler using exception handling is very likely to have problems
, что сказал, если вы хотите, чтобы поймать это, использовать UNIX signal
средство для установки функции, которая не использует C++ функции.
#include <csignal>
#include <cstdlib>
#include <cstdio>
void catch_memory(int) {
std::printf("caught!\n");
std::abort();
}
int main() {
std::signal(SIGSEGV, catch_memory);
int *i = 0;
*i = 6;
}
Кто вам сказал, что это исключение? :) Строго говоря, использование неинициализированных переменных приводит к неопределенному поведению. Даже если вы инициализировали его значением null, вы получите неопределенное поведение, когда попытаетесь разыменовать его. Неопределенное поведение означает, что все может случиться, и состояние вашей программы больше не гарантируется. (Это означает, что он ничего не может сделать, «работа», «сбой» или «да», даже исключение, хотя это, конечно же, не требуется. Windows выбрасывает исключение для ОС, но не исключение C++.) – GManNickG
В C++ компилятор делает неявно добавьте проверки, чтобы убедиться, что вы глупы. Так что такие вещи не поймаются. Исключения происходят, когда разработчик явно реализует проверку и выдает исключение, когда проверка не выполняется. (компилятор НИКОГДА не сделает этого для вас). –
@ GMan - потому что он говорит: «В файле myprogram.exe произошло необработанное исключение win32» – gix