여기에 게시 된 많은 답변이있어서 작업을 끝내기 위해 운이 좋은 경우에 빠질 것이지만 100 % 결정적인 충돌은 없습니다. 일부는 하나의 하드웨어와 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 블록없이 throw하여 중단을 암시 적으로 호출합니다.
현재 처리중인 예외가없는 경우 피연산자가없는 throw-expression을 실행하면 std :: terminate ()가 호출됩니다.
다른 것들은 다음과 같습니다 : 소멸자로부터 던지기 : ISO / IEC 14882 §15.2 / 3
asm { cli; };