Разрешен ли обработчик null terminate()?
-
19-09-2019 - |
Вопрос
В VC ++ 7, если я сделаю следующее:
void myTerminate()
{
cout << "In myTerminate()";
abort();
}
int main( int, char** )
{
set_terminate( &myTerminate );
set_terminate( 0 );
terminate();
return 0;
}
программа ведет себя точно так, как если бы abort()
был вызван напрямую, что является именно тем, что используется по умолчанию terminate()
обработчик делает.
Если я опущу set_terminate( 0 );
оператор вызывается мой обработчик завершения.Так зовущий set_terminate( 0 )
кажется, имеет эффект сброса terminate()
обработчик по умолчанию.
Является ли такое поведение специфичным только для VC ++ 7?Не приведет ли программа к неопределенному поведению, если я вызову set_terminate( 0 )
о какой-то другой реализации?
Решение
Изучение стандарта показывает следующее:
terminate_handler set_terminate(terminate_handler f) throw();
1 Эффекты:Устанавливает функцию обозначается символом f в качестве текущего обработчика функция ...вырезать
2 Требует:f не должен быть нулевым указателем.
3 ВОЗВРАТ:Предыдущий terminate_handler.
Кажется, это нестандартно.