У меня есть функция с блоком try catch, который выглядит следующим образом:
bool apple()
{
OutputDebugStringW(L"entered apple");
try {
SomeObj orange;
int a = global_b->num; // global_b is NULL
int b = global_b->someothernum; // global_b is NULL
}
catch(...) {
OutputDebugStringW(L"leaving apple due to exception");
return false;
}
OutputDebugStringW(L"leaving apple normally.");
return true;
}
Один раз в DbgView я увидел это:
entered apple
leaving apple due to exception
leaving apple due to exception
Функция вызывается в DllMain PROCESS_ATTACH. Что происходит? К сожалению, я перекомпилировал код, и когда я изменил его обратно, как это было в попытке воспроизвести сообщение об исключении, появляющееся дважды, я не смог.
Это в Visual Studio 2010 SP1 с использованием DbgView 4.79. Кто-нибудь когда-нибудь видел что-то, что они выводят, используя OutputDebugString, дважды?
редактировать— Спасибо тем, кто ответил на это. Ответы указывают на то, что я не могу полагаться на исключение NULL-указателя. В Visual Studio я использую /EHa
поймать все как исключение C ++, чтобы, если есть какая-либо проблема с какой-либо функцией, которую я обертываю, я могу просто прервать ее из-за исключения. Это нормально, если я использовал /EHa
ожидать, что нарушения доступа будут переданы catch(...)
? Я так и думал.
Его неопределенное поведение (все может случиться (и кажется тоже)):
int a = global_b->num; // global_b is NULL
int b = global_b->someothernum; // global_b is NULL
Доступ к элементам через нулевой указатель является неопределенным поведением. После этого ваша программа может делать что угодно, поэтому все, что вы видите, является действительным выводом.
Вы полагаетесь на специфическое поведение Visual C ++, перехватывая исключение для доступа к нулевому указателю. Так что это не хороший способ кодировать это поведение. Тестирование на NULL было бы правильным способом сделать это. Смотрите также … Как отловить исключение нулевого указателя?
Почему бы не проверить NULL, а затем ВЫБРОСИТЬ исключение самостоятельно, и посмотреть, может ли это что-то изменить, может помочь определить, является ли причиной этого неопределенное поведение или действительно есть какая-то другая проблема.