Я вижу, что здесь опубликовано много ответов, которые выпадут в удачных случаях для выполнения работы, но ни один из них не является на 100% детерминированным в случае сбоя.Некоторые будут зависать на одном оборудовании и ОС, другие - нет.Тем не менее, существует официальный способ, согласно официальному стандарту C ++, заставить его аварийно завершить работу.
Цитирование из C ++ Стандарт ИСО / МЭК 14882 §15.1-7 :
Если обработка исключенийМеханизм, после завершения инициализации объекта исключения, но до активации обработчика для исключения, вызывает функцию, которая выходит через исключение, вызывается std :: terminate (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) { }
}
Я написал небольшой код, чтобы продемонстрировать это, и его можно найти и попробовать на Идеально здесь .
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;
}
ИСО / МЭК 14882 §15.1/ 9 упоминает throw без блока try, что приводит к неявному вызову abort:
Если в настоящее время не обрабатывается исключение, выполнение выражения throw без вызовов операндов вызывает std :: terminate()
Другие включают в себя: бросок из деструктора: ISO / IEC 14882 §15.2 / 3