Прокомментируйте плиз.
long __stdcall filter(_EXCEPTION_POINTERS* ExceptionInfo)
{
dump(0, MiniDumpWithDataSegs);
return EXCEPTION_CONTINUE_SEARCH;
}
int _tmain(int argc, _TCHAR* argv[])
{
SetUnhandledExceptionFilter(filter);
crash();
}
//1
void crash()
{
std::vector<char> tmp(10000000000);
}
//2
void crash()
{
int tmp = 0;
tmp = 10 / tmp;
}
//3
void crash()
{
std::vector<char> tmp;
tmp[10] = 0;
}
В 1-ом и 2-ом случае вызывается мой фильтр, который создает дамп. В третьем случае дамп не создается. Причины? Какая разница между исключением в 1-ом случае и в 3-ем? Как бы сделать так, что бы управление моему фильтру передавалось всегда?
Вообщем ситуация прояснилась. Не понятным осталось одно — за каким сбрасывается пользовательский обработчик не перехваченных исключений при разруле невалидных параметров.
Продолжу беседу с самим собой

Разве в такой ситуации:
void crash()
{
std::vector<char> tmp;
tmp[10] = 0;
}
не должно кидаться исключение (не уверен, но что-то типа out_of_range)? Зачем это там появляется какой-то _invalid_parameter_handler, которого если нет, то все в итоге заканчивается вызовом terminate. Так все и задумано изначально, или это выдумки мелкософта?
Здравствуйте, mPronin, Вы писали:
P>Продолжу беседу с самим собой
Разве в такой ситуации:
P>P>void crash()
P>{
P> std::vector<char> tmp;
P> tmp[10] = 0;
P>}
P>
P>не должно кидаться исключение (не уверен, но что-то типа out_of_range)?
Нет, здесь никакого исключения по стандарту нет, есть только
UB. Исключения о выходе за пределы бросаются функцией
vector<T>::at(size_type).
Так что в этом случае ты просто пишешь куда попало, со всеми вытекающими.
... << RSDN@Home 1.2.0 alpha rev. 789>>
"mPronin" <68640@users.rsdn.ru> wrote in message
news:2834277@news.rsdn.ru...
> Продолжу беседу с самим собой
Разве в такой ситуации:
> > void crash()
> {
> std::vector<char> tmp;
> tmp[10] = 0;
> }
>
> не должно кидаться исключение (не уверен, но что-то типа out_of_range)?
Не должно. Не помню точно — то ли UB, то ли implementation defined. Чтобы кидалось out_of_range, надо писать tmp.at(10) = 0;
> Зачем это там появляется какой-то _invalid_parameter_handler, которого если нет, то все в итоге заканчивается вызовом terminate. Так все и задумано изначально, или это выдумки мелкософта?
В данном случае мокрософт имеет право выдумывать все что им угодно.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.