2010-02-09 1 views
0

В VC++ 7, если я следующее:Разрешен ли обработчик null terminate()?

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

ответ

4

Глядя в стандарт показывает следующее:

terminate_handler set_terminate(terminate_handler f) throw(); 

эффекты: Устанавливает функцию обозначается F в качестве текущей функции обработчика ... вырезать
Требуется : f не должно быть нулевым указателем.
Возврат: Предыдущий terminate_handler.

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

+1

Раздел 18.6.3.2 :) – Manuel

+0

Так неуказанное поведение, не так ли? – sharptooth

+0

Да, это неопределенное поведение. Вам нужно сохранить предыдущий обработчик и восстановить его явно. –