Разрешен ли обработчик null terminate ()? - PullRequest
0 голосов
/ 09 февраля 2010

В 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 ) в другой реализации?

1 Ответ

4 голосов
/ 09 февраля 2010

Изучение стандарта показывает следующее:

terminate_handler set_terminate(terminate_handler f) throw();

1 Эффекты: устанавливает функцию обозначен f как текущий обработчик функция ... вырезать
2 Требуется: f не должен быть нулевым указателем .
3 Возвращает: предыдущий обработчик terminate_.

Кажется нестандартным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...