Visual Studio 2010 — C ++ try / catch: OutputDebugStringW в выходных данных блока catch дважды?

У меня есть функция с блоком 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(...)? Я так и думал.

0

Решение

Его неопределенное поведение (все может случиться (и кажется тоже)):

int a = global_b->num; // global_b is NULL
int b = global_b->someothernum; // global_b is NULL

Доступ к элементам через нулевой указатель является неопределенным поведением. После этого ваша программа может делать что угодно, поэтому все, что вы видите, является действительным выводом.

0

Другие решения

Вы полагаетесь на специфическое поведение Visual C ++, перехватывая исключение для доступа к нулевому указателю. Так что это не хороший способ кодировать это поведение. Тестирование на NULL было бы правильным способом сделать это. Смотрите также … Как отловить исключение нулевого указателя?

0

Почему бы не проверить NULL, а затем ВЫБРОСИТЬ исключение самостоятельно, и посмотреть, может ли это что-то изменить, может помочь определить, является ли причиной этого неопределенное поведение или действительно есть какая-то другая проблема.

0
По вопросам рекламы [email protected]