Вопрос

В 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.

Кажется, это нестандартно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top