Стандарт C ++ не дает ничего для работы в случае неопределенного поведения. Даже если MS делает. Это зависит от платформы - так что будьте осторожны. Некоторые такие исключения с плавающей точкой превращаются в исключения Win32, которые вы можете попытаться отловить с помощью _set_se_translator()
. Проблема в том, что вы можете перехватить исключения Win32, но тогда ваш стек не будет правильно разматываться. По крайней мере, это не то, на что вы можете поставить свою жизнь. В чем тщетность этого упражнения.
Обновление: исключение выдается преднамеренно, чтобы проверить разматывание стека. Вопрос в том, почему деструктор класса Wrapper не вызывается. - Навин
Если это так - не делай этого. Есть лучшие способы генерировать исключения, чем через неопределенное поведение.
например:
void OnRecvBuffer()
{
try
{
Wrapper a("AddRef");
throw 42; // this'll throw an exception without invoking UB
}
catch(...)
{
notifyError();
}
}
Вы не можете разыменовать нулевой указатель. Вы используете неопределенное поведение здесь:
One* p = NULL;
p->x = 10;
После этой линии все ставки сняты, и вы могли бы убить нас всех;)
p
- указатель на One
объект. Он должен содержать адрес объекта One
. Вы инициализировали его как 0 - по адресу 0. объекта нет. 0 не является допустимым адресом для какого-либо объекта (это гарантируется стандартом).