В 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)
для какой-либо другой реализации?
Раздел 18.6.3.2 :) – Manuel
Так неуказанное поведение, не так ли? – sharptooth
Да, это неопределенное поведение. Вам нужно сохранить предыдущий обработчик и восстановить его явно. –