예외에 대한 최근 질문에 대답하면서 이전 쿼리가 떠 올랐습니다.
다음은 C ++로 컴파일됩니다.
#include <iostream>
using namespace std;
struct weird {
void danger()
{
throw *this;
}
};
int main()
{
weird object;
object.danger();
return 0;
}
그러나 항상 런타임 오류가 발생합니다.
스택을 푸는 동안 객체가 던져지고 보존되지 않습니까?
런타임 오류는에 대한 호출 냄새가납니다 terminate
. 어떻게 발생합니까?
weird object
둘러싸는 범위 (여기서 전역)에서 선언 된 경우 내부 범위에서 작동 할 수 있습니까? (그 스택을 풀어도 우수한 스택에는 영향을 미치지 않습니까?)
결과는 std::terminate()
예외가 포착되지 않았기 때문에에 대한 호출 입니다. 다음으로 변경하면 제대로 작동합니다.
int main() {
weird object;
try {
object.danger();
}
catch (weird &w) {
std::cout << "caught weird\n";
}
}
- 스택을 푸는 동안 객체가 던져지고 보존되지 않습니까?
예외가 발생하면 예외 발생 메커니즘이 발생 된 값의 복사본을 어딘가의 개인 메모리에 복사하므로 'thrown'개체의 수명은 중요하지 않습니다.
(물론 포인터를 던지면 포인터 값이 유지되고 가리키는 객체가 아닙니다.이 경우 객체가 여전히 존재하는지 확인하여 catch 핸들러가 포인터 값으로 잘못된 작업을 수행하지 않도록해야합니다. catch 핸들러는 포인터를 따르지 않습니다.)
- 런타임 오류는에 대한 호출 냄새가납니다
terminate
. 어떻게 발생합니까?
예외가 발생하고 std::terminate()
호출해야하는 해당 catch 핸들러 C ++ 상태가없는 경우 . 적절한 catch 핸들러를 찾는 예외 발생 메커니즘은 적절한 catch 핸들러 std::terminate()
를 찾지 못할 때 호출 하여이를 구현 합니다.
weird object
둘러싸는 범위 (여기서 전역)에서 선언 된 경우 내부 범위에서 작동 할 수 있습니까?
글로벌이든 아니든 상관 없습니다. 예외를 던지는 동작은 (대부분) 어느 쪽이든 잘 정의되어 있습니다.
(지정된 구현 중 하나는 std::terminate()
catch 핸들러를 찾을 수 없을 때 스택이 풀리기 전에 호출되는 경우입니다. 대부분의 구현에서 스택이 풀리지 않는다고 생각합니다.)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다