Ich sehe, es gibt viele Antworten hier gepostet, die in Glücksfälle fallen, um den Job zu erledigen, aber keiner von ihnen sind 100% deterministisch zum Absturz. Einige werden auf einer bestimmten Hardware und einem bestimmten Betriebssystem abstürzen, andere nicht. Es gibt jedoch eine Standardmethode gemäß dem offiziellen C++-Standard, um es zum Absturz zu bringen.
Zitiert von C++ Standard ISO/IEC 14882 §15.1-7 :
Wenn der Mechanismus zur Behandlung von Ausnahmen nach Abschluss der Initialisierung des Ausnahmeobjekts, aber vor der Aktivierung eines Handlers für die Ausnahme, eine Funktion aufruft, die durch eine Ausnahme beendet, 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 er kann gefunden und ausprobiert werden unter Ideone hier .
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ähnungen werfen ohne Try-Block, was zu einem impliziten Aufruf zum Abbruch führt:
Wenn derzeit keine Ausnahme behandelt wird, wird e throw-Ausdrucks ohne Operand std::terminate() aufgerufen
Andere sind: Wurf aus dem Destruktor: ISO/IEC 14882 §15.2/3