ここに投稿された多くの回答が、仕事を成し遂げるためのラッキーケースに該当するようですが、どれもクラッシュすることが100%確定的ではありません。一部は1つのハードウェアとOSでクラッシュしますが、他はクラッシュしません。ただし、それをクラッシュさせるための公式のC ++標準ごとの標準的な方法があります。
C ++標準ISO / IEC 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) { }
}
私はこれを実証するために小さなコードを書いており、ここで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は、tryブロックなしでスローすると、アボートの暗黙的な呼び出しが発生することに言及しています。
現在処理されている例外がない場合、オペランドを指定せずにスロー式を実行すると、std :: terminate()が呼び出されます。
その他には、デストラクタからスロー:ISO / IEC 14882§15.2/ 3
asm { cli; };