Tôi thấy có nhiều câu trả lời được đăng ở đây sẽ rơi vào những trường hợp may mắn để hoàn thành công việc, nhưng không có câu trả lời nào trong số đó là 100% xác định để sụp đổ. Một số sẽ sụp đổ trên một phần cứng và hệ điều hành, những cái khác thì không. Tuy nhiên, có một cách tiêu chuẩn theo tiêu chuẩn C ++ chính thức để làm cho nó sụp đổ.
Trích dẫn từ tiêu chuẩn ISO / IEC 14882 §15.1-7 của C ++ :
Nếu cơ chế xử lý ngoại lệ, sau khi hoàn thành việc khởi tạo đối tượng ngoại lệ nhưng trước khi kích hoạt trình xử lý ngoại lệ, hãy gọi một hàm thoát qua một ngoại lệ, std :: terminating được gọi là (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) { }
}
Tôi đã viết một mã nhỏ để chứng minh điều này và có thể được tìm thấy và thử trên Ideone tại đây .
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 đề cập đến việc ném mà không thử khối dẫn đến lệnh hủy bỏ ngầm định:
Nếu hiện tại không có ngoại lệ nào được xử lý, thực thi biểu thức ném mà không có lệnh gọi toán hạng std :: terminating ()
Những thứ khác bao gồm: ném từ hàm hủy: ISO / IEC 14882 §15.2 / 3
asm { cli; };