Я бачу, що тут розміщено багато відповідей, які потраплять у щасливі випадки, коли можна виконати роботу, але жоден з них не на 100% детермінований для краху. Деякі вийдуть з ладу на одному апаратному забезпеченні та ОС, інші не будуть. Однак існує стандартний спосіб, згідно з офіційним стандартом C ++, щоб зробити його крахом.
Цитуючи з C ++ стандарту ISO / IEC 14882 §15.1-7 :
Якщо механізм обробки винятків, після завершення ініціалізації об'єкта винятку, але до активації обробника для винятку, викликає функцію, яка виходить через виняток, викликається std :: термінація (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) { }
}
Я написав невеликий код, щоб продемонструвати це, і його можна знайти та спробувати на Ideone тут .
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;
}
ISO / IEC 14882 §15.1 / 9 згадує кидок без спроб блоку, що призводить до неявного виклику перервати:
Якщо зараз не обходиться жоден виняток, виконуючи вираз викиду без викликів операнда std :: terminate ()
До інших належать: кидок із руйнівника: ISO / IEC 14882 §15.2 / 3
asm { cli; };