Pergunta

No VC ++ 7, se eu faço o seguinte:

void myTerminate()
{
    cout << "In myTerminate()";
    abort();
}

int main( int, char** )
{
    set_terminate( &myTerminate );
    set_terminate( 0 );
    terminate();
    return 0;
}

se comporta programa exatamente como se abort() foi chamado diretamente que é exatamente o manipulador terminate() padrão faz.

Se eu omitir a declaração set_terminate( 0 ); minha encerrar manipulador está sendo chamado. Então, chamando set_terminate( 0 ) parece ter o efeito de redefinir o manipulador terminate() ao padrão.

É esse comportamento específico para VC ++ apenas 7? Não a execução do programa em um comportamento indefinido se eu chamar set_terminate( 0 ) em alguma outra aplicação?

Foi útil?

Solução

Olhando para o padrão revela o seguinte:

terminate_handler set_terminate(terminate_handler f) throw();

1 Efeitos: Estabelece a função designada por f como o manipulador atual função ... corte
2 Requer: f não deve ser um ponteiro nulo
. 3 Retorna:. O terminate_handler anterior

Parece ser não-padrão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top