Ich sehe, dass hier viele Antworten veröffentlicht werden, die in glückliche Fälle geraten, um die Arbeit zu erledigen, aber keine von ihnen ist zu 100% deterministisch für einen Absturz. Einige stürzen auf einer Hardware und einem Betriebssystem ab, andere nicht. Es gibt jedoch eine Standardmethode gemäß dem offiziellen C ++ - Standard, um einen Absturz zu verursachen.
Zitat aus C ++ Standard ISO / IEC 14882 §15.1-7 :
Wenn der Mechanismus zur Ausnahmebehandlung nach Abschluss der Initialisierung des Ausnahmeobjekts, jedoch vor der Aktivierung eines Handlers für die Ausnahme, eine Funktion aufruft, die über eine Ausnahme beendet wird, wird std :: terminate aufgerufen (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) { }
}
Ich habe einen kleinen Code geschrieben, um dies zu demonstrieren, und kann hier auf Ideone gefunden und ausprobiert werden .
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 erwähnt den Wurf ohne Try-Block, was zu einem impliziten Aufruf zum Abbruch führt:
Wenn derzeit keine Ausnahme behandelt wird, ruft das Ausführen eines Wurfausdrucks ohne Operanden std :: terminate () auf.
Andere schließen ein: vom Zerstörer werfen: ISO / IEC 14882 §15.2 / 3
asm { cli; };