Vejo que há muitas respostas postadas aqui que caem em casos de sorte para concluir o trabalho, mas nenhuma delas é 100% determinística para travar. Alguns travam em um hardware e sistema operacional, outros não. No entanto, existe uma maneira padrão, conforme o padrão oficial do C ++, de fazê-lo falhar.
Citando a norma C ++ ISO / IEC 14882 §15.1-7 :
Se o mecanismo de tratamento de exceções, após concluir a inicialização do objeto de exceção, mas antes da ativação de um manipulador para a exceção, chamar uma função que sai por meio de uma exceção, std :: terminate será chamado (15.5.1).
struct C {
C() { }
C(const C&) {
if (std::uncaught_exceptions()) {
throw 0; // throw during copy to handler’s exception-declaration object (15.3)
}
}
};
int main() {
try {
throw C(); // calls std::terminate() if construction of the handler’s
// exception-declaration object is not elided (12.8)
} catch(C) { }
}
Eu escrevi um pequeno código para demonstrar isso e pode ser encontrado e testado no Ideone aqui .
class MyClass{
public:
~MyClass() throw(int) { throw 0;}
};
int main() {
try {
MyClass myobj; // its destructor will cause an exception
// This is another exception along with exception due to destructor of myobj and will cause app to terminate
throw 1; // It could be some function call which can result in exception.
}
catch(...)
{
std::cout<<"Exception catched"<<endl;
}
return 0;
}
A ISO / IEC 14882 §15.1 / 9 menciona o lançamento sem o bloco try, resultando em uma chamada implícita para abortar:
Se atualmente nenhuma exceção está sendo manipulada, a execução de uma expressão de lançamento sem operando chama std :: terminate ()
Outros incluem: lançamento do destruidor: ISO / IEC 14882 §15.2 / 3
asm { cli; };